C# NServiceBus 5,RabbitMQ使用单个代理队列定义EndpointName

C# NServiceBus 5,RabbitMQ使用单个代理队列定义EndpointName,c#,.net,rabbitmq,nservicebus,C#,.net,Rabbitmq,Nservicebus,我正在使用托管在我自己进程中的NServiceBus和RabbitMQ传输,并且刚刚从NserviceBus4.6.5升级到NserviceBus5.0.0 以前,我的端点配置如下: var queueName = ConfigurationManager.AppSettings["queuename"]; Configure.ScaleOut(s => s.UseSingleBrokerQueue()); Configure.Transactions.D

我正在使用托管在我自己进程中的NServiceBus和RabbitMQ传输,并且刚刚从NserviceBus4.6.5升级到NserviceBus5.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();
                 });
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);
var queueName=ConfigurationManager.AppSettings[“queueName”];
Configure.ScaleOut(s=>s.UseSingleBrokerQueue());
Configure.Transactions.Disable();
Configure.Features.Enable();
Configure.Features.Disable();
Configure.Serialization.Xml();
返回
配置.With(typeof(SomeClass).Assembly,typeof(RabbitMQ.Assembly)
.DefineEndpointName(队列名称)
.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()
.PurgeOnStartup(错误)
.UnicastBus()
.RunHandlerSunderingPrincipal(false)
.ImpersonateSender(错误)
.LoadMessageHandlers()
.DisableTimeoutManager()
.RavenSagaPersister()
.RavenSubscriptionStorage()文件
.UserAventTimeOutpersister()文件
.CreateBus()
开始
(() => {
DependencyManager.ConfigureServiceBusDependencies();
Configure.Instance.LicensePath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,“NServiceBus license.xml”);
Configure.Instance.ForInstallationOn().Install();
});
这非常有效,创建了一个名为“some.property.queue.name”的队列,该队列取自我的app.config文件

但是,升级到NServiceBus 5.0.0.0时,我使用了新的配置api,并将我的端点配置为:

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();
                 });
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);
var queueName=ConfigurationManager.AppSettings[“queueName”];
var配置=新总线配置();
configuration.EndpointName(queueName);
configuration.LicensePath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,“NServiceBus license.xml”);
configuration.ScaleOut().UseSingleBrokerQueue();
configuration.Transactions().Disable();
configuration.enableffeature();
configuration.DisableFeature();
configuration.UseSerialization();
configuration.UsePersistence()
.SetDefaultDocumentStore(DocumentStore.Value)
.For(Storage.Sagas、Storage.Subscriptions、Storage.timeout);
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”);
RijndaelEncryptionService();
配置.PurgeOnStartup(false);
configuration.UseTransport();
注册表组件(DependencyManager.ConfigureServiceBusDependencies);
configuration.AssembliesToScan
(typeof(SomeClass).Assembly,typeof(RabbitMQTransport).Assembly);
configuration.EnableInstallers();
var bus=总线创建(配置);
现在它创建了一个名为“some.property.queue.name.MyLaptoName”的队列。因此,NServiceBus将机器名固定在队列名的末尾,即使我已将scaleout选项配置为使用单个代理队列

这是一个bug,还是它在4.6.5中的工作方式—即使在使用单个代理队列时,bug和机器名称也应始终固定在队列名称的末尾


非常感谢您在这个问题上提供的任何帮助。

在查看了关于github I cam上的NServiceBus的报告后,请参阅 声明ScaleOut().x已过时,将从6.0.0中删除

所以我把它从配置中去掉,看看这是否解决了我的问题。它没有:(但它让我思考了它的含义。因此,实际上应该始终指定机器名,即使是localhost

所以我改变了这一行:

configuration.EndpointName(queueName);
为此:

configuration.EndpointName(string.Format("{0}@localhost", queueName));

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

在查看了github I cam上的NServiceBus报告的问题后 声明ScaleOut().x已过时,将从6.0.0中删除

所以我把它从配置中去掉,看看这是否解决了我的问题。它没有解决我的问题。但它让我思考了它的含义。所以实际上应该始终指定机器名,即使是localhost

所以我改变了这一行:

configuration.EndpointName(queueName);
为此:

configuration.EndpointName(string.Format("{0}@localhost", queueName));

然后端点创建了队列,但没有为机器名添加后缀。

为了在向外扩展时无缝支持回调和pubsub,我们必须将v2.0.0更改为具有单独的回调接收器。您可以通过调用

configuration.UseTransport<RabbitMQTransport>()
.DisableCallbackReceiver();
configuration.UseTransport()
.DisableCallbackReceiver();
以下是完整的doco页面,详细解释了所有这些:


.SingleBrokerQueue()被忽略,您可以安全地将其删除。(将在NServiceBus core的v6中被淘汰)

为了在向外扩展时无缝地支持回调和pubsub,我们必须更改v2.0.0以拥有一个单独的回调接收器。您可以将其关闭