NServiceBus 8配置Learning Transport存储目录报错的解决办法
问题描述
当前使用NServiceBus的配置如下:
builder.Host.UseNServiceBus(ctx => { var endpointConfiguration = new EndpointConfiguration("my.orders"); var transport = endpointConfiguration.UseTransport(new LearningTransport()); transport.RouteToEndpoint( assembly: typeof(CreateOrderMessage).Assembly, destination: "my.orders"); endpointConfiguration.UseSerialization<SystemJsonSerializer>(); var conventions = endpointConfiguration.Conventions(); conventions.DefiningMessagesAs(type => typeof(IDTestMessage).IsAssignableFrom(type) ); return endpointConfiguration; });
该配置会将Learning Transport文件存储在解决方案根目录,本地运行正常,但在Docker中运行时出现严重崩溃。因此希望指定Learning Transport文件的存储目录。
尝试修改代码如下:
var endpointConfiguration = new EndpointConfiguration("my.orders"); var transport = endpointConfiguration.UseTransport(new LearningTransport()); transport.StorageDirectory("PathToStoreTransportFiles"); transport.RouteToEndpoint( assembly: typeof(CreateOrderMessage).Assembly, destination: "my.orders");
但出现错误:
RoutingSettings' does not contain a definition for 'StorageDirectory'
疑问:NServiceBus 8的配置方式是否有所不同?或者需要安装额外的NuGet包?该如何解决这个问题?
解决方案
这是NServiceBus 8的API变更导致的问题:UseTransport方法返回的是通用的RoutingSettings类型,而StorageDirectory是Learning Transport特有的配置项,必须获取到Learning Transport专属配置对象才能调用。
可以通过以下两种方式解决:
方式一:初始化Transport时直接指定目录
创建LearningTransport实例时,直接设置StorageDirectory属性:
var transport = new LearningTransport { StorageDirectory = "PathToStoreTransportFiles" }; var endpointConfiguration = new EndpointConfiguration("my.orders"); endpointConfiguration.UseTransport(transport); // 后续路由配置保持不变 transport.RouteToEndpoint( assembly: typeof(CreateOrderMessage).Assembly, destination: "my.orders");
方式二:通过GetSettings获取专属配置
如果已通过UseTransport完成初始化,可通过GetSettings方法获取Learning Transport的专属配置对象:
var endpointConfiguration = new EndpointConfiguration("my.orders"); var transport = endpointConfiguration.UseTransport<LearningTransport>(); // 获取LearningTransport专属配置并设置存储目录 var learningSettings = transport.GetSettings<LearningTransportSettings>(); learningSettings.StorageDirectory("PathToStoreTransportFiles"); // 路由配置保持不变 transport.RouteToEndpoint( assembly: typeof(CreateOrderMessage).Assembly, destination: "my.orders");
额外注意事项
- 确保已安装正确的NuGet包:
NServiceBus.LearningTransport,该包是NServiceBus 8中Learning Transport的独立包,需保证其版本与NServiceBus主包版本一致。 - Docker环境下建议使用容器内的非临时目录(如
/data),并通过挂载卷的方式持久化该目录,同时确保应用进程对该目录拥有读写权限,避免容器重启后数据丢失或权限不足导致的崩溃。
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

