NServiceBus - сообщение не всегда доставляется и вызывает исключение. Не удается зафиксировать транзакцию.

Мы используем NServiceBus в производстве, и в наших файлах журналов мы видим следующую ошибку:

ERROR Our.Namespace.SomeMessageHandler [(null)] <(null)> - MethodName  --> end with exception: NServiceBus.Unicast.Queuing.FailedToSendMessageException: Failed to send message to address: our.namespace.worker@somemachinename ---> System.Messaging.MessageQueueException: Cannot enlist the transaction.
    at System.Messaging.MessageQueue.SendInternal(Object obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)
    at NServiceBus.Unicast.Queuing.Msmq.MsmqMessageSender.NServiceBus.Unicast.Queuing.ISendMessages.Send(TransportMessage message, Address address)
    --- End of inner exception stack trace ---
    at NServiceBus.Unicast.Queuing.Msmq.MsmqMessageSender.ThrowFailedToSendException(Address address, Exception ex)
    at NServiceBus.Unicast.Queuing.Msmq.MsmqMessageSender.NServiceBus.Unicast.Queuing.ISendMessages.Send(TransportMessage message, Address address)
    at NServiceBus.Unicast.UnicastBus.SendMessage(List`1 addresses, String correlationId, MessageIntentEnum messageIntent, Object[] messages)
    at NServiceBus.Unicast.UnicastBus.SendMessage(Address address, String correlationId, MessageIntentEnum messageIntent, Object[] messages)
    at NServiceBus.Unicast.UnicastBus.NServiceBus.IBus.Send(Address address, Object[] messages)
    at Our.Namespace.SomeMessageHandler.MethodName(EventLogVO eventLog, IApplicationContext applContext, CreateEventLogHistory message)

Очередь на целевой машине существует (проверено дважды). Странно то, что это происходит не постоянно и не для каждого сообщения, отправленного в эту очередь, а иногда (это означает, что в эту очередь поступают сообщения).

Искал и не нашел похожего случая.

Что мне здесь не хватает?


person developer82    schedule 28.09.2014    source источник
comment
Основываясь на вашем другом вопросе, я предполагаю, что время вашей транзакции истекло. Если нет, я рекомендую вам показать некоторый код и описать, что делают сообщения, которые не работают.   -  person Phil Sandler    schedule 29.09.2014


Ответы (2)


Недавно у нас была эта ошибка, и мы отследили ее как одну из следующих:

  • Производительность базы данных. У нас был длительный запрос, который мы настроили, но проблема осталась.
  • Большой объем сделки. Возможно, вы делаете что-то, что задействует слишком много менеджеров ресурсов.
  • Ресурсы MSMQ. В конечном итоге наш диск оказался недостаточно быстрым для выполнения ввода-вывода, необходимого для того, что мы делали с MSMQ.

Я бы попытался отследить истинный источник (надеюсь, вы получите некоторые идеи сверху). Но если ничего не помогает, сначала включите ведение журнала System.Transactions, чтобы убедиться, что это действительно тайм-аут. Если это так, используйте этот раздел в app.config

person Adam Fyles    schedule 29.09.2014
comment
+1 к превышению квоты MSMQ (вы можете увеличить ее), также проверьте свою очередь недоставленных транзакционных сообщений и очистите ее. - person Sean Farmar; 30.09.2014

У меня это случилось со мной в обработчике, для завершения которого потребовалось больше минуты, в итоге я увеличил время ожидания, добавив это в app.config

<system.transactions>
  <defaultSettings timeout="00:05:00"/>
</system.transactions>

Согласно этому: https://erictummers.wordpress.com/2014/05/28/cannot-enlist-the-transaction/

Кроме того, я изменил конфигурацию машины в соответствии с этим сообщением: http://blogs.msdn.com/b/ajit/archive/2008/06/18/override-the-system-transactions-default-timeout-10-минут-в-коде.aspx

Я также написал быстрое приложение, которое редактирует machine.configs: https://github.com/hfortegcmlp/MachineConfigEditor

person Hugo Forte    schedule 30.12.2014