NServiceBus,无论出于何种原因,都必须将空消息发布到MSMQ,如果是这样,为什么以及何时发生?下面有更长的解释。
我工作的项目使用NServiceBus版本4.该版本不允许"多主机"单个进程中不同队列的事件处理程序,如果您的项目包含40个不同的队列,这可能会很不方便。
为了在开发中克服这个问题,我做了一个小型的路由器"应用程序,它监听所有必要的MSMQ队列,并简单地将来自它们的所有消息转发到单个"统一"队列。那"统一" queue被指定为"统一端点"的队列名称。进程,它引用通常从这些不同队列处理的所有消息的所有处理程序。
设置类型的工作,似乎(至少有大多数处理程序),但有一个神秘的行为(我认为,这可能与设置没有与其他一些处理人员合作)。也就是说,一旦项目启动,我的"路由器"立即发现一些空的MSMQ消息发布到它必须收听的队列。显然,NSB会在启动期间出于某种原因发布这些消息(并且很可能是在NSB有机会再次查看它们之前,路由器正在窃听它们。)
我确信这不是我实现的人工制品,因为除非NSB也已启动,否则不会发生这种情况。我很好奇原因。
答案 0 :(得分:3)
NServiceBus,默认情况下,autosubscribes表示所有已处理事件,如果它知道发布它们的端点。您看到的这些空消息可能是订阅消息,因为它们是在端点启动阶段发送的。
订阅消息背后的机制记录在here。 TL;用于不提供本机发布的传输的DR(例如,MSMQ,Azure存储队列)NServiceBus使用订阅消息和内部订阅列表(存储)来模拟它。
您可以通过查看message intent
标题来验证这一点。如果它们不是订阅消息,请分享此类消息的标题的完整列表以供进一步调查。