【问题标题】:Prevent machine name being appended to endpoint name防止机器名称附加到端点名称
【发布时间】:2014-09-26 18:09:38
【问题描述】:

我们已经使用 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&lt;&gt; 行(以前有 Msmq),以及暂时的 .DoNotCreateQueues() 行,因为我想强制它创建队列表(虽然我是在 IIS express 下本地运行)

问题是,当它创建队列表时,它会将我的机器名称附加到“基本”表的名称上。 IE。它创建的表(当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 队列表来注册他们的订阅。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    完整的线程在这里:

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

    【讨论】:

    • 谢谢。这让我找到了我们需要的解决方法(我们不是使用回调的客户端,我们是发布者)
    【解决方案2】:

    Phil 的Answer 将我带到了这个comment

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

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

    原因是默认支持回调

    嗯,在我们的例子中,我们没有使用回调 - 我们是发布者,而不是客户端,所以这正是我们需要的修复。

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 2019-05-09
      • 2015-12-11
      • 2011-07-11
      • 2017-11-17
      • 2011-12-23
      • 1970-01-01
      • 2019-12-08
      • 2014-08-31
      相关资源
      最近更新 更多