我正在使用我自己的进程中使用RabbitMQ传输托管的NServiceBus,刚刚从NServiceBus 4.6.5升级到NServiceBus 5.0.0。
以前我的端点配置如下:
var queueName = ConfigurationManager.AppSettings["queuename"];
Configure.ScaleOut(s => s.UseSingleBrokerQueue());
Configure.Transactions.Disable();
Configure.Features.Enable<Sagas>();
Configure.Features.Disable<SecondLevelRetries>();
Configure.Serialization.Xml();
return
Configure.With(typeof(SomeClass).Assembly, typeof(RabbitMQ).Assembly)
.DefineEndpointName(queueName)
.DefaultBuilder()
.RavenPersistenceWithStore(DocumentStore.Value)
.DefiningCommandsAs(type => type.Namespace != null && type.Namespace.EndsWith("Contracts.Commands"))
.DefiningEventsAs(type => type.Namespace != null && type.Namespace.EndsWith("Contracts.Events"))
.DefiningMessagesAs(type => type.Namespace != null && type.Namespace.EndsWith("Contracts.Messages"))
.RijndaelEncryptionService()
.UseTransport<RabbitMQ>()
.PurgeOnStartup(false)
.UnicastBus()
.RunHandlersUnderIncomingPrincipal(false)
.ImpersonateSender(false)
.LoadMessageHandlers()
.DisableTimeoutManager()
.RavenSagaPersister()
.RavenSubscriptionStorage()
.UseRavenTimeoutPersister()
.CreateBus()
.Start
(() => {
DependencyManager.ConfigureServiceBusDependencies();
Configure.Instance.LicensePath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "NServiceBus-Licence.xml"));
Configure.Instance.ForInstallationOn<Windows>().Install();
});
哪个工作得很好,并创建了一个名为“some.appropriate.queue.name”的队列,该队列取自我的app.config文件。
然而,当升级到NServiceBus 5.0.0.0时,我使用了新配置api并配置了我的端点,如下所示:
var queueName = ConfigurationManager.AppSettings["queuename"];
var configuration = new BusConfiguration();
configuration.EndpointName(queueName);
configuration.LicensePath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "NServiceBus-Licence.xml"));
configuration.ScaleOut().UseSingleBrokerQueue();
configuration.Transactions().Disable();
configuration.EnableFeature<Sagas>();
configuration.DisableFeature<SecondLevelRetries>();
configuration.UseSerialization<XmlSerializer>();
configuration.UsePersistence<RavenDBPersistence>()
.SetDefaultDocumentStore(DocumentStore.Value)
.For(Storage.Sagas, Storage.Subscriptions, Storage.Timeouts);
configuration.Conventions()
.DefiningCommandsAs(type => type.Namespace != null && type.Namespace.EndsWith("Contracts.Commands"));
configuration.Conventions().DefiningEventsAs(type => type.Namespace != null && type.Namespace.EndsWith("Contracts.Events"));
configuration.Conventions()
.DefiningMessagesAs(type => type.Namespace != null && type.Namespace.EndsWith("Contracts.Messages"));
configuration.RijndaelEncryptionService();
configuration.PurgeOnStartup(false);
configuration.UseTransport<RabbitMQTransport>();
configuration.RegisterComponents(DependencyManager.ConfigureServiceBusDependencies);
configuration.AssembliesToScan
(typeof(SomeClass).Assembly, typeof(RabbitMQTransport).Assembly);
configuration.EnableInstallers();
var bus = Bus.Create(configuration);
现在它创建了一个名为“some.appropriate.queue.name.MyLaptopName”的队列。因此NServiceBus正在将机器名称添加到队列名称的末尾,即使我已将scaleout选项配置为使用单个代理队列。
这是一个错误,还是它在4.6.5中的工作方式,即使使用单个代理队列,错误也应始终将机器名称添加到队列名称的末尾?
非常感谢您对此问题的任何帮助。
答案 0 :(得分:4)
为了在扩展时无缝地支持回调和pubsub,我们不得不改变v2.0.0以拥有一个单独的回调接收器。你可以通过调用
来关闭它configuration.UseTransport<RabbitMQTransport>()
.DisableCallbackReceiver();
这是完整的doco页面,详细解释了所有这些:
http://docs.particular.net/nservicebus/rabbitmq/configuration-api
.SingleBrokerQueue()被忽略,你可以安全地删除它。 (将在NServiceBus核心的第6版中废弃)
答案 1 :(得分:0)
在github上查看针对NServiceBus报告的问题后,我发现了https://github.com/Particular/NServiceBus/issues/2412 表明ScaleOut()。x已过时,将从6.0.0中删除。
所以我从我的配置中取出了它,看看是否能解决我的问题。它没有:(但它让我思考它的意思。所以真的应该指定机器名,甚至是localhost。
所以我改变了这一行:
configuration.EndpointName(queueName);
到此:
configuration.EndpointName(string.Format("{0}@localhost", queueName));
然后端点创建了队列而没有后缀机器名。