JTA、2 フェーズ コミット、JMS および JDBC トランザクションに苦労しています。アイデアは(要するに)
- キューでメッセージを受信する
- いくつかのデータベース操作を実行します
- データベース操作が成功したときに、メッセージを確認します
を取得しXAQueueConnectionFactory
、 を作成しXAQueueSession
、セッションからレシーバーを作成し、メッセージ リスナーを設定しました。
リスナー内のonMessage
メソッドで、ユーザー トランザクションを開始し、jdbc を実行してトランザクションをコミットするか、何か問題が発生した場合はロールバックを実行します。ここで、ユーザー トランザクションがコミットされたときに、メッセージが確認されることを期待 (別名「希望」) しました。
しかし、そうはなりません。メッセージはまだキューにあり、何度も再配信されます。
私は何が欠けていますか?セッションを再確認したところ、承認モードは実際には " SESSION_TRANSACTED
" であり、getTransacted
true を返します。
Java EE コンテナーも、スプリングも、メッセージ駆動型 Bean もありません。私はスタンドアロンの JTA bitronix を使用しています。