1

トランザクションでキューの複数のメッセージを受信し、ある時点でロールバックして、このキューからメッセージを消費する他のプログラムがメッセージを受信できるようにするにはどうすればよいですか?

私はこのように何とかしようとしています:

ObjectMessage obj = (objectMessage) consumer.receive();

ObjectMessage obj2 = (ObjectMessage) consumer.receive(10000);
if(obj2 == null) session.rollback(); //if we haven't received thesecond message after 10     second, also the first message should be rolled back so other consumerprograms can take it.
4

2 に答える 2

2

このキューからのメッセージを消費する他のプログラムがメッセージを受信できるように、ロールバックをポイントしますか?

ロールバックは、メッセージをキューに送り返し、他の人がそれを消費するための良い戦略ではありません。メッセージを複数のコンシューマーに伝達する場合は、Queue の代わりに Tpoic を使用します。

メッセージの返送について。JMS ブローカーへのメッセージのロールバック/再送信は、確認モードに依存します。

承認がトランザクションベースの場合は、次を使用します

session.rollback();

それ以外の場合は、次のように使用します

session.recover();

確認応答されていないすべてのメッセージを JMS ブローカに戻します。

自動確認モード以外のメッセージは、確認設定に基づいてセッションを確認またはコミットするまでブローカーに残ります。

したがって、メッセージ処理が成功したら、それを承認します。メッセージ処理にエラー/例外がある場合は、ロールバック/回復して返送します。失敗したメッセージを再度処理したくない場合 (時間制約のある処理にするか、指定された時間内に処理しないようにする)、メッセージを確認してエラーをログに記録します。間にメッセージを送信することに制限はありません。

ロールバックされたメッセージは再び同じクライアントに返される可能性があるため、セレクターを使用しない限り、ロールバックは完全には役に立たない可能性があります。セレクターをチェックすると、コンテンツ ベースのルーティングが可能になります。

于 2012-05-07T07:36:03.400 に答える
0

なぜプログラムがロールバックしたいのか、私には明らかではありません。受信したメッセージを処理できませんか? なぜ他の消費者が同じメッセージを必要とするのでしょうか?

clientAcknowledge受信メッセージの「書き戻し」にメッセージ確認モードを使用することもできます。message.acknowledge()このモードでは、受信したメッセージに対してを行いません。

于 2012-05-07T08:26:22.363 に答える