1

Java で MQ キューからメッセージを読み取ろうとしていますが、例外を処理するときにロールバックするときの流れについて少し混乱しています。

ループで実行され、メッセージを探すリーダー クラスがあります。リーダーを初期化すると、接続とセッションが作成されます。次に、ループ内でメッセージを読み取るときが来ると、MQQueueandが作成されますMQQueueReceiver。これは正常に機能し、JMSMessage をキューから取得し、それを別のスレッドに渡して作業します。ワーカー スレッドが失敗した場合は、そのメッセージをキューに戻したい (クラスター内の他のノードによって再試行されるようにするため)。

私の質問は、どのようにロールバックするのですか? クラスにrollback()メソッドがあることに気付きました。MQQueueSessionしかし、すべてのメッセージに同じセッションを再利用しています。同じセッションを何度も再利用するのではなく、メッセージごとに新しいセッションを作成する必要があることを理解する必要がありますか?

これは私にとって直感に反しています。

また、セッションは で作成されconnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);ます。以外の別のフラグを使用する必要がありCLIENT_ACKNOWLEDGEますか?

4

2 に答える 2

1

JMS 1.1 仕様では、セッションが次のように定義されていることに注意してください。

セッション - メッセージを送受信するためのシングルスレッド コンテキスト

仕様の後半では、次のように述べています。

セッションへの同時アクセスを制限する理由は 2 つあります。まず、セッションはトランザクションをサポートする JMS エンティティです。マルチスレッドのトランザクションを実装するのは非常に困難です。次に、セッションは非同期メッセージ消費をサポートします。JMS では、非同期メッセージの消費に使用されるクライアント コードが複数の同時メッセージを処理できる必要がないことが重要です。さらに、Session が複数の非同期コンシューマーでセットアップされている場合、これらの個別のコンシューマーが同時に実行されている場合に、クライアントが強制的に処理されないようにすることが重要です。これらの制限により、JMS は一般的なクライアントにとって使いやすくなっています。より洗練されたクライアントは、複数のセッションを使用することで、必要な並行性を得ることができます。

いいえ、メッセージごとに 1 つのセッションは必要ありません。ただし、セッションで生成または消費されるすべてのメッセージは、それらを他のスレッドに渡し、この動作が仕様に従っている場合でも、一緒にコミットまたはロールバックされます。

Evgeniy で説明されているように、トランザクション セッションと COMMIT/ROLLBACK を使用しますが、メッセージをすべて同じ作業単位内の同じセッション スコープに保持するように注意してください。

于 2013-04-19T19:29:47.850 に答える