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(Boolean startup) във вашето проследяване на стека.

Това ми казва, че вашата крайна точка е свързана с дистрибутор. След като всичките ви манипулатори на съобщения завършат, крайна точка, свързана с дистрибутор, ще изпрати ReadyMessage обратно към контролната опашка на дистрибутора, за да каже „Приключих с тази работа. Моля, изпратете още!“

Това трябва да се случи в рамките на същата транзакция като останалата част от вашата работа, но очевидно изпращането на MSMQ има проблеми с включването в тази транзакция. Това може да сочи към проблем с DTC. Би било интересно да знаете какво друго се случва във вашите манипулатори на съобщения за този тип съобщения, които също се включват в транзакцията. Не извършвате ръчно ангажимент или връщате нещо назад, нали?

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