2016-05-13 37 views
0

不NServiceBus,在任何时候,以任何理由,有权发布消息MSMQ,如果是这样,为什么,什么时候发生?以下更长解释。为什么NServiceBus将空邮件发送到MSMQ?

我正在使用的一个项目使用NServiceBus版本4.该版本不允许在单个进程中为不同队列“多宿主”事件处理程序,如果您的项目包含40个左右不同的队列。

要发展克服这个问题,我做了一个小的“路由器”的应用程序,它会监听所有必要的MSMQ队列和简单的转发所有邮件成一个单一的“统一”的队列。这个“统一”队列被指定为“统一端点”进程的队列名称,它引用所有处理程序的所有消息,这些消息通常会从这些各种队列中处理。

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

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

回答

3

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

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

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

+0

谢谢,我会尽快查看标题。但后来我的问题在这里变得更加深入 - 为什么这里有任何消息被“发送”(到了被转发给我的外部监听器的地步)?发送这样的消息是MSMQ要求吗?是否有任何规范,说明有关这些“订阅”信息的内容,他们的意图是什么,以及它们是如何由第三方处理的,而第三方恰好接收这些信息? –

+1

我编辑了我的答案以包含该信息。 –

+0

太好了,谢谢。链接到你添加的文档(奇怪的是我自己没有找到它,我确定我全部阅读了它)解释了我正在寻找的一切! –

相关问题