0

情報 :: XA トランザクションで DefaultMessageListener を実装しています。MessageListener 実装を使用しました。

シナリオ:: 私の XA トランザクションは DB と JMS Q パブリッシュの間です。いずれかで「データ エラー」が発生した場合は、ソース メッセージを別の Q に「移動」し、残りのメッセージの処理を続行する必要があります。

問題:: 現在、DB トランザクションが DataIntegrity エラー (主キー違反) で失敗した場合、XA トランザクションはコンテナーでロールバックします (MessageListener 実装ではありません)。そのため、元のメッセージは Q にロールバックされ、メッセージ リスナーはこのメッセージを無期限に受け取り、処理に失敗します。

いくつかの例外をチェックするにはどうすればよいですか? また、残りのメッセージを続行できるように、コンテナー内でそれらを別の方法で処理できますか?

銀座

4

1 に答える 1

0

それが XA トランザクションのポイントです。すべてがコミットされるか、何もコミットされないかのどちらかです。

データベース トランザクションが JMS トランザクションに関係しないようにする場合は、

@Transactional(propagation=Propagation.REQUIRES_NEW) 

リスナーの上流のメソッドで。リスナーで例外をキャッチして処理すると、JMS トランザクションがコミットされます。

このシナリオでは (他のリソースが関係している場合を除き)、XA は実際には必要ありませんが、メッセージが重複する (わずかな) 可能性を処理する必要があります (DB トランザクションがコミットされ、JMS トランザクションが何らかの理由でコミットしない場合)。 .

http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.htmlを参照してください。

于 2013-03-24T20:51:37.910 に答える