2012-02-24 46 views
1

偶尔当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() 
+0

我们最终发现这是由于先前存在的数据库争用问题而发生的。当我们的处理程序代码遇到问题时,它会抛出一个似乎过早结束DTC事务的异常。当MSMQ无法登记不可用的事务时,这导致上述错误。我会告诉你为什么我们的代码首先不会让这些更明显的(尴尬的)细节。谢谢你的帮助! – 2012-03-06 21:51:48

回答

1

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

这告诉我您的端点已连接到分销商。在所有消息处理程序完成后,连接到分销商的终端会将ReadyMessage发送回分销商的控制队列,以表示“我已完成该项工作,请发送更多信息!”

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

+0

感谢您的帮助。不,我们不会手动进行与交易相关的任何事情(提交或回滚)。我目前正在研究DTC以查看是否/如何做出贡献。我会再次更新我发现的内容。 – 2012-02-27 15:51:36

+0

接受这个答案,因为它1)是唯一的答案;-) 2)提供了一些非常有用的信息。 – 2012-06-04 12:42:44

相关问题