2014-09-28 23 views
3

我们在生产中使用NServiceBus,而在我们的日志文件,我们看到以下错误:NServiceBus - 消息并不总是带来和造成的异常无法登记事务

ERROR Our.Namespace.SomeMessageHandler [(null)] <(null)> - MethodName --> end with exception: NServiceBus.Unicast.Queuing.FailedToSendMessageException: Failed to send message to address: [email protected] ---> 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) 

在目标机器上的队列存在(双选中)。这里奇怪的是它并不是一直发生,并且每个消息都发送到该队列,但偶尔会发生(这意味着有消息到达该队列)。

已搜索并未找到类似的情况。

我在这里错过了什么?

+0

根据你的其他问题,我猜你的交易是超时。如果没有,我建议你展示一些代码并描述那些失败的消息正在做什么。 – 2014-09-28 22:05:17

回答

3

我们最近有此错误并跟踪它是下列之一:

  • 数据库的性能。我们调查了一个长时间运行的查询,但问题依然存在。
  • 大型交易范围。你可能正在做一些会导致太多资源经理参与的事情。
  • MSMQ资源。最终,我们的磁盘速度不够快,无法执行我们使用MSMQ所需的IO。

我会尝试追查真正的来源(希望你从上面得到一些想法)。但是,如果所有其他的失败,首先打开System.Transactions日志记录,看看它是否真的超时。如果是,那么在App.config使用this section

+0

超过MSMQ配额+1(您可能想要增加它),也检查您的交易死信队列并清除它 – 2014-09-30 13:11:42

1

我有这种事发生在我在接手一分钟即可完成, 我最终加入这在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-of-10-minutes-in-the-code.aspx

我也写了一个快速的应用程序,编辑machine.configs: https://github.com/hfortegcmlp/MachineConfigEditor

相关问题