2011-08-04 7 views
1

MessageConsumerMessageListenerオブジェクトを設定して、そのコンシューマでを呼び出した場合、どうなりますか?プロバイダがにメッセージを送信するか、メッセージがMessageListenerオブジェクトによって処理されている間に引き続きブロックされますか?JMSの質問receive()/ MessageListener precedence

答えて

3

セッションは非同期または同期モードでなければならないため、例外が発生します。 JMS仕様の4.4.6

からセッションのシングルスレッドの制御制限の1つの結果は、メッセージリスナと セッションも同期 メッセージを受信するために使用することはできないということです。セッションは、メッセージリスナへの 配信に使用される制御スレッド専用であるか、またはクライアントコードによって制御開始スレッド に割り当てられています。同じセッションで両方を結合しようとするのは間違いです。

0

私は、これを行うことが理にかなっている状況を想像していません。

receive()が優先されなかったとします。おそらく効果はないでしょう。

receive()が優先されたとします。受け取った後に何が起こると思いますか?おそらくあなたが再び受信を呼び出すまで、メッセージコンシューマーはメッセージを受け取りますか?その場合、システムの動作は事実上1つの巨大な競合状態です。メッセージの到着時間が異なると、異なる動作が発生します。

これ以上のことができるはずです。おそらく制御可能な "適応型" MessageConsumerを持つでしょう。

+0

djna:答えをありがとう。私は必ずしもこれが当てはまる状況を想像しているわけではありません。このような状況に対処するプロバイダがあることと、さらに関係します。私は、たとえその消費者が以前にMessageLsitenerオブジェクトを与えられていたとしても、誤ってsrcファイルを 'receive()'と呼ぶ可能性があると思います。そのような場合、プロバイダはどのように反応しますか? – shrini1000

+2

プロバイダはJMSExceptionをスローします。 WebSphere MQは、 "JMSCC0033:receive()呼び出しが行われたときに、セッションが非同期で使用されているときに同期メソッド呼び出しが許可されない" – strmqm