2012-02-24 22 views
1

NServiceBusがメッセージを受け取ると、以下の例外が発生して失敗することがあります。これによりNServiceBusが再試行されます(再試行の上限が設定されています)。再試行の1つでは、メッセージが正常に処理されることがありますが、すべての再試行が同じ例外で失敗するのが一般的です。この場合、メッセージは、すべての再試行が失敗したときに予想通りにエラーキューにルーティングされます。NServiceBus:「失敗した処理が完了しました」メッセージ処理のイベントが発生します。

私の質問は... 最初にこの例外が発生する原因は何ですか?私のコードがスタックトレースに表示されないので、メッセージハンドラコードに関連して表示されません。

  • NServiceBusバージョン:2.6.0.1504
  • OS:ハンドラのコードはここに.NET 3.5またはそれ以前の

をターゲットにしているWindows Server 2003

  • がフル例外メッセージとスタックトレースです:

    NServiceBus.Unicast.Transport.Msmq.MsmqTransport [(null)] - Failed raising 'finished message processing' event. System.Messaging.MessageQueueException: Cannot enlist the transaction. 
        at System.Messaging.MessageQueue.SendInternal(Object obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType) 
        at System.Messaging.MessageQueue.Send(Object obj, MessageQueueTransactionType transactionType) 
        at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.SendMsmqMessage(Message m, String destination) 
        at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.Send(TransportMessage m, String destination) 
        at NServiceBus.Unicast.UnicastBus.SendReadyMessage(Boolean startup) 
        at NServiceBus.Unicast.UnicastBus.TransportFinishedMessageProcessing(Object sender, EventArgs e) 
        at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.OnFinishedMessageProcessing() 
    
  • +0

    最終的に、これは既存のデータベース競合問題の結果として発生していました。ハンドラコードで問題が発生したとき、DTCトランザクションが途中で終了したように見える例外がスローされました。これにより、MSMQが使用できないトランザクションを登録できなかったときの上記のエラーが発生しました。なぜ私たちのコードがこれを最初に明らかにしなかったのかについての(恥ずかしい)詳細を私はあなたに惜しまないでしょう。ご協力いただきありがとうございます! –

    答えて

    1

    スタックトレースにNServiceBus.Unicast.UnicastBus.SendReadyMessage(ブールスタートアップ)メソッドがあります。

    これは、エンドポイントがディストリビュータに接続されていることを示しています。すべてのメッセージハンドラが完了したら、ディストリビュータに接続されたエンドポイントは、ReadyMessageをディストリビュータの制御キューに送り返し、「完了しました。もっと送信してください!

    これは残りの作業と同じトランザクション内で発生するはずですが、明らかにMSMQ送信がそのトランザクションに参加することに問題があります。これはDTCの問題を指摘する可能性があります。トランザクションにも参加しているそのメッセージタイプのメッセージハンドラで何が起こっているのか知ることは面白いでしょう。あなたは手作業でコミットしていないか、何かを巻き戻していませんか?

    +0

    ご協力ありがとうございます。いいえ、トランザクション関連(コミットまたはロールバック)を手動で行うわけではありません。私は現在、それが貢献しているかどうかを見るためにDTCを探しています。私が見つけたものをもう一度更新します。 –

    +0

    これを答えとして受け入れるのは、1)は唯一の答えです;-) 2)非常に役立つ情報がいくつかあります。 –

    関連する問題