防止将计算机名称附加到端点名称

时间:2014-08-04 09:43:38

标签: c# sql-server asp.net-web-api nservicebus transport

我们已经使用NServiceBus开发了大量服务,我们正处于从使用MSMQ传输切换到使用SQL Server传输的过程中。

对于NSB托管服务,这一点相对简单。但是我们在设置一些网站时遇到了问题(asp.net web api)。

我们在网站内自托管,具有以下配置:

NServiceBus.Configure.Serialization.Xml();
var bus = NServiceBus.Configure.With(/* specific assemblies */)
            .CastleWindsorBuilder(container)
            .DefineEndpointName(
                ConfigurationManager.AppSettings["nsb:EndpointName"])
            .DefiningCommandsAs(t =>
                t.GetCustomAttributes(typeof(/* our marker */), false)
                     .GetLength(0) > 0)
            .DefiningEventsAs(t =>
                t.GetCustomAttributes(typeof(/* our marker */), false)
                     .GetLength(0) > 0)
            .SetEndpointSLA(new TimeSpan(0,10,0))
            .UseNHibernateTimeoutPersister()
            .UseNHibernateSubscriptionPersister()
            .UseTransport<SqlServer>() //<-- Changed here
            .UnicastBus()
            .LoadMessageHandlers()
            //.DoNotCreateQueues()  //We create queues manually.
            .CreateBus()
            ;

我改变的唯一行是UseTransport<>行(之前有Msmq),暂时是.DoNotCreateQueues()行,因为我想强制它创建队列桌子(虽然我在IIS快递下在本地运行)

问题是,当它创建队列表时,它将我的机器名称附加到“基础”表的名称上。即它创建的表格(EndpointName应用设置为Service.Name时)的格式如下:

Service.Name.MYMACHINENAME
Service.Name.Retries
Service.Name.Timeouts
Service.Name.TimeoutsDispatcher

当它创建MSMQ队列时,它会创建:

Service.Name
Service.Name.Retries
Service.Name.Timeouts
Service.Name.TimeoutsDispatcher

事实上,已经更新到SQL Server传输的订阅者正在寻找Service.Name队列表来注册他们的订阅。

我做错了什么或需要哪些其他信息来解决这个问题?

2 个答案:

答案 0 :(得分:4)

我在special.net google群组上发布了这个确切的问题。这是我从John Simons那里得到的解释:

  

之所以如此,是因为NServiceBus回调是相关的   一个内存中的字典,用于跟踪消息ID的输出和输出   消息ids进来,换句话说,当你这样做   Bus.Send()。在我们添加的网站上注册(/ * callback here * /)   项目内存字典表示我们发送了一条消息   使用id x,我们还存储回调委托,然后我们   接收消息,我们检查该字典和相关性   消息id匹配我们触发回调委托。

     

所以这意味着如果你扩展你的网站(例如网络农场)   如果是主节点,则将同一端点部署到多台计算机   这些端点的队列名称被命名为相同的任何缩放   out端点可以接收假设要转到的消息   特定的端点/机器,然后因为回调而失败   消息不会在内存中的字典中退出   端点/机器。

完整主题在这里:

https://groups.google.com/d/msg/particularsoftware/W1RkPH6CBng/Ehiz0SPxKwoJ

答案 1 :(得分:2)

菲尔Answer带领我去了comment

  

这是设计的。默认情况下,sql / rabbit / active将包含计算机名称。我们的As_A_Server覆盖了这个:

Configure.ScaleOut(s=>s.SingleBrokerQueue());
     

原因是默认支持回调

嗯,在我们的情况下,我们不使用回调 - 我们是发布商,而不是客户,所以这正是我们要求的解决方案。