C# NServiceBus事件以超时队列结束
我正在用HandleMyEvent类来处理这个事件C# NServiceBus事件以超时队列结束,c#,nservicebus,C#,Nservicebus,我正在用HandleMyEvent类来处理这个事件 public class HandleMyEvent : IHandleMessages<MyEvent> { private readonly IBus _bus; private readonly IWorkorker _workerTools; public HandleProductInstanceEvent( IBus bus, IWorkorker worker) {
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);
}
}
为什么会出现此错误?您之所以会出现此错误,是因为在NServiceBus中处理MSMQ消息默认情况下在一个超时为1分钟的事务中运行 一旦通过事务超时,任何新操作(如发送消息或在数据库中存储内容)都将失败 无法登记该事务 您应该选择超出预期处理时间的时间,或者选择此端点 请注意,运行5分钟的消息处理程序是很长的时间。在如此长的一段时间内针对事务资源进行事务处理并因此进行锁定并不是最佳选择 一旦消息处理失败,事务将回滚,将消息放回队列。然后,无论您配置了多少次第一级重试尝试,都会重试。在您的场景中最有可能是5。之后,将其移动到第二级重试
.timeout队列是负责处理二级重试的超时管理器的输入队列。如果没有立即从此队列中提取消息,则表示您没有在该端点上运行超时管理器。添加了Configure.Transactions.Advanced(设置=>settings.DefaultTimeout(TimeSpan.frommins(10));到我的端点配置,现在它可以工作了:)
NServiceBus.Unicast.Queuing.FailedToSendMessageException: Failed to send message to address: My.Bus.Service@MyServer ---> 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