2011-06-08 10 views
1

NServiceBusを使用する場合、基本的に2種類の例外があります。NServiceBus内のNHibernateトランザクションをロールバックする方法

環境:必要なコンポーネントは現在利用できません。通常、トランザクションの完全なロールバックが発生します。これは、NServiceBusドキュメンテーション内のロールバックの背後にある説明です(メッセージをバスに戻すことを含みます - これは素晴らしいと思います)。これはどうすればいいですか?

妥当性検査:ビジネスロジック、ルールなどの理由で正常に処理できないメッセージが処理されています。すべてのデータベースのやりとりをロールバックしたいが、キューにコマンドを保存する価値はありません。その場合、MSMQ部分ではなく、トランザクションのNHibernateセクションをロールバックしたいだけです。これはどうすればいいですか?通常は、単一のメッセージが処理される前に検証を実行しますが、複数のメッセージを1つのトランザクションにまとめてロールバックしたい場合は、事前検証では不可能です。

私の前提は、答えが非常に明白であり、私はそれを見落としているか、私がしようとしていることは(検証例外に関して)不可能です。

答えて

1

ありがとうございました。答えは二人の間のどこかにあると私は信じている。

私たちは残念ながら検証サービスを実装することはできませんが、単にメッセージ処理ロジックに対してより良い初期検証を追加しました。

残念ながら、私たちがv3に達するまでは、メッセージの問題をインテグレータに警告するためにメッセージ応答機能を利用しているため、エラーキューを現在使用できません。未処理のエラーを投げると、応答が生成されなくなります。

1

NSBは、メッセージをエラーキュー(v2.5)に移動することでメッセージを取り除きます。 v3では、この機能が強化され、障害(DB、カスタムなど)を処理するためのオプションが増えます。エラーキューはapp.configに設定されています。

1

私の経験では、メッセージが分散トランザクションに参加するときに成功する確率が非常に高いことを保証するのが最も簡単な方法です。

したがって、コマンドメッセージをディスパッチするときに、ほとんどの検証ロジックが実行されていて、本当に例外的な場合にはロールバックが予約されているはずです。

クライアントが検証を実行できない場合は、現在のサービスの前に検証サービスを挿入する必要があります。この検証サービスは、無効なコマンドメッセージを実際のサービスに到達する前にどこか別の場所にルーティングする可能性があります。

関連する問題