NServiceBus:是什么原因导致“失败提升'已完成的消息处理'事件。”?

时间:2012-02-24 20:50:38

标签: msmq nservicebus

有时,当NServiceBus收到消息时,它会失败,但下面有例外。这会导致NServiceBus重试(直到它配置的重试限制)。有时,其中一次重试会导致消息成功处理,但所有重试都会因同一异常而失败。在这种情况下,当所有重试失败时,消息将按预期路由到错误队列。

我的问题是...... 首先会导致此异常的原因是什么?它似乎与我的消息处理程序代码无关,因为我的代码没有出现在堆栈跟踪中。

  • NServiceBus版本:2.6.0.1504
  • 操作系统:Windows Server 2003
  • 处理程序代码的目标是.NET 3.5或更早版本

以下是完整的异常消息和堆栈跟踪:

NServiceBus.Unicast.Transport.Msmq.MsmqTransport [(null)] - Failed raising 'finished message processing' event.  System.Messaging.MessageQueueException: Cannot enlist the transaction.
     at System.Messaging.MessageQueue.SendInternal(Object obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)
     at System.Messaging.MessageQueue.Send(Object obj, MessageQueueTransactionType transactionType)
     at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.SendMsmqMessage(Message m, String destination)
     at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.Send(TransportMessage m, String destination)
     at NServiceBus.Unicast.UnicastBus.SendReadyMessage(Boolean startup)
     at NServiceBus.Unicast.UnicastBus.TransportFinishedMessageProcessing(Object sender, EventArgs e)
     at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.OnFinishedMessageProcessing()

1 个答案:

答案 0 :(得分:1)

我在堆栈跟踪中看到了NServiceBus.Unicast.UnicastBus.SendReadyMessage(布尔启动)方法。

这告诉我您的端点已连接到分发服务器。完成所有消息处理程序后,连接到分发服务器的端点会将ReadyMessage发送回分发服务器的控制队列,说“我已完成该工作。请发送更多!”

这应该发生在与其他工作相同的事务中,但显然MSMQ发送在该事务中遇到了麻烦。这可能表明DTC存在问题。知道你的消息处理程序中还有哪些消息类型也会在事务中登记,这将是很有趣的。您不是手动提交或滚动任何东西吗?