2012-05-07 25 views
1

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

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. 

答えて

1

いくつかのポイントのロールバック:

イムは、このように何とかそれをやろうとしていますか?

ロールバックは、メッセージをキューに戻すのには適しておらず、他のユーザーはそれを消費します。メッセージを複数のコンシューマに伝えたい場合は、キューの代わりにTpoicを使用します。

返信について JMSブローカへのメッセージのロールバック/再送信は、承認モードによって異なります。

ご了承場合、ベースのトランザクションは

session.recover(); 

次それはバックJMSブローカーへのすべての未応答メッセージを戻すだろう

session.rollback(); 

他の賢明な利用を使用しています。

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

メッセージが正常に処理されたら、それを確認してください。 msg処理にエラー/例外がある場合は、ロールバック/リカバリして返送してください。失敗したメッセージを処理したくない場合(時間制限の処理/所定の時間内に処理されないようにする)、再度メッセージを確認してエラーを記録してください。間にメッセージを送信することに制限はありません。

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

+0

よろしくお願いいたします。私はすべての消費者にメッセージを伝えたくありません。 「サーバ」はキューにメッセージを送信します。 Programm aはこれらのメッセージを消費し、新しいメッセージが10秒以上待っていれば、受信したメッセージを書き戻して他のコンシューマーがそれを受け取れるようにする必要があります。ロールバックするのが正しい方法ではありませんか? – Moonlit

+0

編集された回答。助けてくれることを望む。 – neo

+0

メッセージは車のコンポーネント(エンジン、タイヤ、シャーシ)に似ています。クライアントはメッセージを消費し、メッセージを使用して車を構築します。クライアントはすでに(コミットされていないトランザクションセッションで)エンジン、シャーシ、3つのタイヤを受け取っていると言いますが、新しいTireメッセージは到着しません。この場合、クライアントはすべてのコンポーネント(3つのタイヤ、エンジンとシャーシ)を待ち行列に入れておくことで、シャシーが車を完成させるのを待つ別のクライアントを待ちます。したがって、私は失敗時に書き戻したくないですが、タイムアウトになります(30秒後に新しいコンポーネントが届かない場合は書き戻します) – Moonlit

0

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

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

+0

'javax.jms.Message。一つのメッセージクライアント上で 'acknowledge'を呼び出すと、そのメッセージが配送されたセッションで消費されたすべての*メッセージが確認されます - 選択されたメッセージだけを確認することができないため、acknowledge()'はちょっと誤解を招きます。 –

+0

真。ただし、一部のJMSクライアントでは、メッセージごとに確認応答機能が用意されています。私はActiveMQがそれをすると思います – Shashi

関連する問題