为什么 NServiceBus post 向 MSMQ 清空消息?

Why does NServiceBus post empty messages to MSMQ?

NServiceBus 是否在任何时候出于任何原因必须向 MSMQ post 清空 消息,如果是,为什么以及何时发生?下面有更长的解释。

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

为了克服开发中的这个问题,我制作了一个小型 "router" 应用程序,它会监听所有必要的 MSMQ 队列,并将来自它们的所有消息简单地转发到一个 "unified" 队列中。 "unified" 队列被指定为 "unified endpoint" 进程的队列名称,它引用了通常从这些不同队列处理的所有消息的所有处理程序。

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

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

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

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

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