使NServiceBus丢失消息的东西

时间:2012-03-19 22:35:20

标签: iis iis-7 nservicebus

我有一个NServiceBus配置,它在开发人员机器和我的开发环境中运行良好。

然而,当我将它移动到我的测试环境时,我的消息才开始被抛出。

这是系统:

  1. 应用从主机系统获取TCP消息并将其发送到MSMQ(称之为FromMainframe)。
  2. IIS中托管的应用程序为该MSMQ提供了“Handle”方法,并处理来自大型机的消息。
  3. 在我的测试环境中,第二步只发生了一半。该消息从MSMQ弹出,但不由我的应用程序处理。

    实际上我的数据 LOST ! NServiceBus将它们从队列中删除,但我永远不会处理它们。它们甚至不在错误队列中!

    这些是我尝试过的事情,试图弄清楚发生了什么:

    1. 检查配置文件
    2. 将远程调试器附加到进程以查看Handle方法正在执行的操作
      • 永远不会调用Handle方法(但是当我附加到开发环境时,我的Handle方法中的断点被击中并且一切正常运行)。
    3. 将我的Dev版本重新部署到Test Envioronment并再次尝试第2步(以防版本不完全相同。)
    4. 再次检查配置文件
    5. 检查错误队列是否未填满
      • 错误队列保持为空(我希望它会填满,然后我的数据不会丢失)。
    6. 检查可能从我的MSMQ中提取内容的任何其他进程
      • 我关闭了我的IIS网站,FromMainframe队列中的消息开始备份。
      • 当我重新打开时,消息消失得相当快(但仍然不是一次全部消失)。它们消失的速度太快,以至于我的Handle方法无法处理它们。
    7. 再次检查配置文件。
    8. 运行NServiceBusTools \ MsmqUtils \ Runner.exe \ i
      • 我跑了,重新启动,再次运行它以获得良好的衡量标准!
    9. 再次检查配置(我一定错过了SOMETHING吗?)
    10. 检查开发环境配置未指向测试环境
      • 我认为不可能使用另一台计算机的MSMQ作为输入队列,但检查不会有什么坏处。
    11. 查找可能会默默消灭我的消息的任何捕获块。
    12. 最后一次检查配置文件。
    13. 在另一台机器上重新创建我的测试环境(它完美运行)
    14. 在IIS之外运行我的东西
      • 当我在IIS之外托管(使用NServiceBus.Host.exe)时,一切正常。那么它必须是一个IIS的东西吗?
    15. 疯狂,希望堆栈溢出可以提供任何洞察力。

1 个答案:

答案 0 :(得分:2)

所以我对发生了“回答”的事情了解得足够多。

当我设置我的NServiceBus自托管时,我有一个加载消息处理程序的调用。

NServiceBus.Configure.With().LoadMessageHandlers()

(有更多配置,但为了简洁我省略了它们)

当你调用它时,NServiceBus会扫描assmeblies中实现IHandleMessages<T>的类。

所以,不知何故,在我的测试环境机器上,调用IHandleMessages的类的目录的ServiceBus扫描无法找到我的类(即使程序集绝对存在)。

事实证明,如果NServiceBus找不到处理消息的内容,它将 THROW IT AWAY !!!

在我看来,这是一个完整的设计错误。 NServiceBus的整个想法是不丢失你的数据,但在这种情况下它就是这样!

现在,一旦你知道这个陷阱,有几种方法可以解决它。

  1. 明确说明您的处理程序应该是什么:

    NServiceBus.Configure.With().LoadMessageHandlers<First<MyMessageType>>()

  2. 更进一步的保护是添加另一个处理“其他所有”的处理程序。 IMessage是所有消息有效负载的基础,因此如果您在其上放置处理程序,它将获取所有消息 如果将IMessage设置为handle after,则会处理您的消息,然后它将处理NServiceBus无法找到处理程序的所有内容。如果在Handle方法中抛出异常会导致NServiceBus将消息移动到error队列。 (我认为应该是默认行为。)