2011-03-04 10 views
1

私は外部データベースからデータを読み取る1つのサービス(service1)を持っています。それを変換してキューに送信します。例外がスローされたときにnservicebusハンドラから返信を送信する方法は?

2番目のサービス(service2)はメッセージを処理して処理します。処理に失敗した例外がスローされ、NServiceBusが5回再試行して(通常の動作)、応答は送信されません。 。:(

すべてのサービスの取引で働く

私の質問は: 例外がスローされたときにサービス1にハンドラからの応答を送信する(あるいは単にバック異なるメッセージを送信)する方法

私がしたいですか?ただサービス2に失敗した処理サービス1に通知

編集1: 外部データベース内のレコードをアシの茂っより具体的なサービス1マークに関してはそれはフュルトに必要です。他のデータを読み取る。

service2からservice1への応答を返し、例外がスローされたサービスのレコードをunmarkする必要があります。

次に、外部データベースからデータを読み取ると、このレコードが再度取り込まれる場合があります。

答えて

5

あなたは常に例えば、代わりにそれ自身のTransactionScopeのBus.Replyをラップすることができます

using (var scope = new TransactionScope(TransactionScopeOptions.RequiresNew)) 
{ 
    Bus.Reply(your message here) 
    scope.Complete(); 
} 

これはエラーの原因となったトランザクションからのエラーの結果として実行しているトランザクションを分離します。

0

Bus.Reply()が決してしないのは、それが同じトランザクションの一部であるということです。 1つのオプションは、何かにエラーキューを見て、メッセージを発信者にプッシュバックすることです。

もう1つの方法は、トランスポートでFailedMessageProcessingイベントを利用することです。これの欠点は、何が失敗しているのか、何かが失敗していることを知ることができないことです。また、望ましくない可能性のある再試行ごとに報告します。

実際に同期要求/応答が必要な場合があるため、NSBが必要なものではない可能性があります。ビジネス上の事情をさらに詳しくご紹介いただければ、より多くの提案をすることができます。

+0

「理由Bus.Reply()を行うことはありませんが、それはの一部であるということであるようになり、あなたのtry-catchブロックの後にブロックを使用して文を囲みます同じトランザクション。 - それも私の考えでした。私は同期通信は必要ありません。おそらく例外をキャッチし、適切なエラーコードを返すだけで十分です。私は緩やかに再試行しますが、私の「再試行」は外部データベースからデータを読み取る次の繰り返しによって保証されます。 – dariol

0

ちょうどジョナサン・オリバーへの拡張として、最終的にはこの

  finally 
      { 
       using (var scope = new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew)) 
       { 
        Bus.Reply<MyResponseObject>(reply); 
        scope.Complete(); 
       } 
      } 
関連する問題