我有一个NServiceBus配置,它在开发人员机器和我的开发环境中运行良好。
然而,当我将它移动到我的测试环境时,我的消息才开始被抛出。
这是系统:
FromMainframe
)。在我的测试环境中,第二步只发生了一半。该消息从MSMQ弹出,但不由我的应用程序处理。
实际上我的数据 LOST ! NServiceBus将它们从队列中删除,但我永远不会处理它们。它们甚至不在错误队列中!
这些是我尝试过的事情,试图弄清楚发生了什么:
Handle
方法正在执行的操作
Handle
方法(但是当我附加到开发环境时,我的Handle
方法中的断点被击中并且一切正常运行)。 FromMainframe
队列中的消息开始备份。Handle
方法无法处理它们。答案 0 :(得分:2)
所以我对发生了“回答”的事情了解得足够多。
当我设置我的NServiceBus自托管时,我有一个加载消息处理程序的调用。
NServiceBus.Configure.With().LoadMessageHandlers()
(有更多配置,但为了简洁我省略了它们)
当你调用它时,NServiceBus会扫描assmeblies中实现IHandleMessages<T>
的类。
所以,不知何故,在我的测试环境机器上,调用IHandleMessages的类的目录的ServiceBus扫描无法找到我的类(即使程序集绝对存在)。
事实证明,如果NServiceBus找不到处理消息的内容,它将 THROW IT AWAY !!!
在我看来,这是一个完整的设计错误。 NServiceBus的整个想法是不丢失你的数据,但在这种情况下它就是这样!
现在,一旦你知道这个陷阱,有几种方法可以解决它。
明确说明您的处理程序应该是什么:
NServiceBus.Configure.With().LoadMessageHandlers<First<MyMessageType>>()
更进一步的保护是添加另一个处理“其他所有”的处理程序。 IMessage
是所有消息有效负载的基础,因此如果您在其上放置处理程序,它将获取所有消息
如果将IMessage设置为handle after,则会处理您的消息,然后它将处理NServiceBus无法找到处理程序的所有内容。如果在Handle
方法中抛出异常会导致NServiceBus将消息移动到error
队列。 (我认为应该是默认行为。)