2012-02-24 4 views
1

Иногда, когда NServiceBus берет сообщение, он терпит неудачу с исключением ниже. Это заставляет NServiceBus повторить попытку (до установленного предела повторной попытки). Иногда один из попыток приводит к успешному управлению сообщением, но для всех повторных попыток с одним и тем же исключением бывает обычным. В этом случае сообщение направляется в очередь ошибок, как ожидалось, когда все попытки не выполняются.NServiceBus: Что заставляет событие «Failed raise» завершено обработать сообщение «событие»?

Мой вопрос: Что может послужить причиной этого исключения в первую очередь? Это не похоже на мой код обработчика сообщений, так как мой код не отображается в трассировке стека. версия

  • NServiceBus: 2.6.0.1504
  • ОС: Windows Server 2003
  • Handler код целевой платформы .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 не смог привлечь недоступную транзакцию. Я пощажу вас (неловкие) подробности о том, почему наш код не сделал это более очевидным в первую очередь. Спасибо за вашу помощь! –

ответ

1

Я вижу метод NServiceBus.Unicast.UnicastBus.SendReadyMessage (Boolean startup) в вашей трассировке стека ,

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

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

+0

Спасибо за помощь. Нет, мы не делаем никаких операций с транзакциями (совершая или откатываясь). В настоящее время я изучаю DTC, чтобы узнать, способствуют ли они/как это. Я обновлю все, что найду. –

+0

Принимая это как ответ, так как он 1) является единственным ответом ;-) и 2) предоставил некоторую очень полезную информацию. –

Смежные вопросы