NServiceBus: Что вызывает «Не удалось вызвать событие« законченная обработка сообщений ».»? - PullRequest
1 голос
/ 25 февраля 2012

Иногда, когда 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 Ответ

1 голос
/ 25 февраля 2012

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

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

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

...