【问题标题】:Why does NServiceBus post empty messages to MSMQ?为什么 NServiceBus 向 MSMQ 发布空消息?
【发布时间】:2016-09-09 22:33:54
【问题描述】:

NServiceBus 是否在任何时候出于任何原因都必须将 empty 消息发布到 MSMQ,如果是,为什么以及何时发生?下面有更详细的解释。

我从事的一个项目使用了 NServiceBus 版本 4。该版本不允许在单个进程中为不同队列“多托管”事件处理程序,如果您的项目包含 40 个左右不同的队列,这可能会很不方便。

为了克服开发中的这个问题,我制作了一个小型“路由器”应用程序,它侦听所有必要的 MSMQ 队列,并将来自它们的所有消息简单地转发到一个“统一”队列中。该“统一”队列被指定为“统一端点”进程的队列名称,该进程引用了通常从这些不同队列处理的所有消息的所有处理程序。

这种设置似乎有效(至少对于大多数处理程序而言),但有一种神秘的行为(我认为这可能与设置有关不 与其他一些处理程序一起工作)。也就是说,一旦项目启动,我的“路由器”会立即发现许多空的 MSMQ 消息发布到它必须侦听的队列中。显然,NSB 出于某种原因在启动期间发布了这些消息(并且很可能路由器在 NSB 有机会再次查看它们之前将它们告发)。

我确信这不是我实施的人工制品,因为除非 NSB 也启动,否则不会发生这种情况。我很好奇其中的原因。

【问题讨论】:

    标签: nservicebus msmq esb


    【解决方案1】:

    NServiceBus,默认情况下,autosubscribes 到所有处理的事件,如果它知道发布它们的端点。您看到的这些空消息可能是订阅消息,因为它们是在端点启动阶段发送的。

    订阅消息背后的机制记录在 here。 TL;DR 用于不提供本机发布的传输(例如 MSMQ、Azure 存储队列),NServiceBus 使用 subscribe 消息和内部订阅列表(存储)来模拟它。

    您可以通过检查 message intent 标头来验证这一点。如果它们不是订阅消息,请分享此类消息的完整标头列表以供进一步调查。

    【讨论】:

    • 谢谢,我会尽快查看标题。但后来我的问题在这里更深入一点 - 为什么任何消息真的在这里“发送”(到被转发给我的外部听众的地步)?发送这样的消息是 MSMQ 的要求吗?是否有任何规范说明这些“订阅”消息,它们的目的是什么,以及它们应该如何由碰巧收到它们的第三方处理?
    • 太好了,谢谢。您添加的文档的链接(奇怪的是我自己没有找到它,我确信我已经阅读了所有内容)解释了我正在寻找的一切!
    • .. 并且 message intent 标头确实是所有空消息的“订阅”。
    • 对于这个答案的潜在读者,我还要补充一点,MSMQ 中没有真正的“标题”。 “消息意图”存储在消息的 AppSpecific 属性中,可以通过MsmqUtilities.Convert(message).MessageIntent 访问(您还需要执行queue.MessageReadPropertyFilter.SetAll(),否则在读取属性时会出现异常)。有趣的是,在MessageReadPropertyFilter 上启用SetAll 似乎也解决了我原来的路由问题。显然,如果没有此设置,路由消息的属性会在传输过程中丢失。
    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2013-10-10
    相关资源
    最近更新 更多