簡體   English   中英

NServiceBus事件以超時隊列結束

[英]NServiceBus events ends in timeout queue

我正在使用HandleMyEvent類處理事件

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: 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

為什么我收到此錯誤?

您收到該錯誤是因為默認情況下,在NServiceBus中處理MSMQ消息會在超時為1分鍾的事務中運行。

一旦傳遞了事務超時,任何新操作(如發送消息或在數據庫中存儲內容)都將失敗

無法登記交易。

您應該將事務超時增加到超過預期處理時間或關閉此端點上的事務

請注意,運行5分鍾的消息處理程序很長時間。 在這么長的時間內對交易資源進行交易並因此鎖定並不是最佳的。

一旦消息處理失敗,事務就會回滾,將消息放回隊列中。 然后,重試您已配置的許多第一級重試嘗試。 在您的方案中最有可能是5。 之后,它將被移至二級重試。

.timeout隊列是負責處理二級重試的超時管理器的輸入隊列。 如果未立即從此隊列中獲取消息,則表明您未在該端點上運行超時管理器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM