NServiceBus 5与RabbitMQ定义具有单个代理队列的EndpointName

时间:2014-10-08 07:04:39

标签: c# .net rabbitmq nservicebus

我正在使用我自己的进程中使用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中的工作方式,即使使用单个代理队列,错误也应始终将机器名称添加到队列名称的末尾?

非常感谢您对此问题的任何帮助。

2 个答案:

答案 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));

然后端点创建了队列而没有后缀机器名。