2015-11-24 87 views
1

结束我处理事件与HandleMyEvent类NServiceBus事件超时队列

public class HandleMyEvent : IHandleMessages<MyEvent> 
{ 

    private readonly IBus _bus; 
    private readonly IWorkorker _workerTools; 


    public HandleProductInstanceEvent(IBus bus, IWorkorker worker) 
    { 
     _bus = bus; 
     _workerTools = worker; 

    } 

    public void Handle(IProductInstancesUpdatedEvent message) 
    { 
     var worker = new myWorker(_bus, _worker); 
     myWorker.DoWork(message.data); 
    } 
} 

myWorker.DoWork可以为其做之前长达5分钟。

当发布者发送一个“MyEvent”时,看起来处理程序在消息在超时队列中结束之前收到5个事件,我猜测它在放弃之前会重试5次。

在日志文件中我能找到这个入口

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.Transports.Msmq.MsmqMessageSender.Send(TransportMessage message, Address address) in c:\work\3206e2123f54fce4\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs:line 59 

为什么会出现这个错误?

回答

3

您正在收到该错误,因为默认情况下,处理NServiceBus中的MSMQ消息在超时时间为1分钟的事务中运行。

一旦你通过事务超时任何新的业务,如在数据库中发送消息或储存的东西,将与

失败无法登记事务。

您应该将increase your transaction timeout设置为大于预期的处理时间或此端点上的turn off transactions

请注意,运行5分钟的消息处理程序是很长时间的。在很长一段时间内交易并因此锁定交易资源并不是最佳选择。

消息处理失败后,事务回滚,将消息放回队列。然后重试您配置的许多第一级重试尝试。最有可能的5在你的情况。之后,它被转移到二级重试。

.timeout队列是负责处理二级重试的超时管理器的输入队列。如果消息没有立即从此队列中获取,那么您没有在该端点上运行超时管理器。

+0

Added Configure.Transactions.Advanced( settings => settings.DefaultTimeout(TimeSpan.FromMinutes(10)));到我的端点配置,现在它工作:) – CruelIO