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()

person Nate Sauber    schedule 24.02.2012    source источник
comment
В конце концов мы обнаружили, что это происходило из-за существовавших ранее проблем с конфликтом между базами данных. Когда наш код обработчика обнаружил проблему, он вызвал исключение, которое, по-видимому, преждевременно завершило транзакцию DTC. Это привело к указанной выше ошибке, когда MSMQ не смог зарегистрировать недоступную транзакцию. Я избавлю вас от (смущающих) подробностей о том, почему наш код вообще не сделал это более очевидным. Спасибо за вашу помощь!   -  person Nate Sauber    schedule 07.03.2012


Ответы (1)


Я вижу метод NServiceBus.Unicast.UnicastBus.SendReadyMessage (логический запуск) в трассировке стека.

Это говорит мне, что ваша конечная точка подключена к дистрибьютору. После того, как все ваши обработчики сообщений будут завершены, конечная точка, подключенная к дистрибьютору, отправит сообщение ReadyMessage обратно в контрольную очередь дистрибьютора, чтобы сказать: «Я закончил с этой работой. Пожалуйста, отправьте еще!»

Предполагается, что это произойдет в той же транзакции, что и остальная часть вашей работы, но, очевидно, у отправки MSMQ возникают проблемы с включением в эту транзакцию. Это может указывать на проблему с диагностическим кодом неисправности. Было бы интересно узнать, что еще происходит в ваших обработчиках сообщений для этого типа сообщений, которые также участвуют в транзакции. Вы не фиксируете и не откатываете что-либо вручную, не так ли?

person David Boike    schedule 25.02.2012
comment
Спасибо за вашу помощь. Нет, мы не делаем вручную ничего, связанного с транзакциями (фиксация или откат). В настоящее время я изучаю DTC, чтобы узнать, способствует ли это / каким образом. Я снова обновлю то, что найду. - person Nate Sauber; 27.02.2012
comment
Приняв это как ответ, поскольку он 1) является единственным ответом ;-) и 2) предоставил очень полезную информацию. - person Nate Sauber; 04.06.2012