【问题标题】:Condition when subscribers in NServiceBus send an auto-subscribe messageNServiceBus 中的订阅者发送自动订阅消息时的条件
【发布时间】:2013-12-30 16:28:48
【问题描述】:

我发现即使我的 NSB 进程不处理 DTOXXX 的消息,它仍然会向 DTOXXX 的发布者队列发送自动订阅消息。

这不是我们想要的行为。我希望进程发布和订阅 DTOYYY 的消息,但任何使用 DTOXXX 的通信都严格只发送。

如果这还不够清楚,我有 2 个包含我的 DTO 的程序集。我想建立一个 pub/sub 总线,但仅适用于 YYY.dll 中的程序集。至于另一个程序集中的 DTO,我希望仅通过 SEND(而不是 pub sub)进行通信。

我遇到的问题是 NSB 正在向其他进程发送自动订阅消息,即使:

  1. XXX 程序集中的 DTO 没有处理程序。仅引用它以便 YYY NSB 可以向 XXX NSB 发送消息。
  2. 2 个模块之间的通信严格只发送。考虑到实际用例和业务需求,这样做是为了促进低耦合。

如何正确设置我的模块?那就是我需要以某种方式告诉 NSB,自动订阅消息,但仅限于给定命名空间/程序集中的消息。

【问题讨论】:

    标签: c# nservicebus messaging soa publish-subscribe


    【解决方案1】:

    您可以通过在配置界面中实现自己的 DefiningEventsAs 来定义自己的规则,将消息视为命令/事件(或普通消息)。 Nsb 只会自动订阅事件。这可能会对您的用例有所帮助...

    【讨论】:

      【解决方案2】:

      有几种方法可以处理这个问题,第一种是您可以关闭自动订阅和手动订阅。这是通过端点配置中的 .DoNotAutoSubscribe() 完成的。从那里您将解析 IBus 实例,然后显式订阅您关心的消息。

      第二种方法是将您的消息与所有其他代码分离到不同的程序集中,并仅通过 app.config 文件将事件(发布/订阅)映射到发布者。

      【讨论】:

      • 亚当,你能在第二段扩展一点吗?我已经在这样做了。但是我仍然需要在配置中映射命令,否则我需要在调用 bus.send 时提供它们的端点。然而,NSB 现在认为它应该订阅这些端点,即使映射仅用于命令和发送目的。我如何告诉 NSB 某些映射仅用于发送,而不用于发布/订阅。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2021-02-25
      • 1970-01-01
      相关资源
      最近更新 更多