我们已经使用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
队列表来注册他们的订阅。
我做错了什么或需要哪些其他信息来解决这个问题?
答案 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)