3

TextMessage を受信するメッセージ リスナーがあります。ObjectMessage を受信したら、キューのリッスンを停止したいと考えています。私の問題は、onMessage(Message msg) メソッド内で consumer.close() を呼び出すと、ObjectMessage がキューから削除されていないように見えることです。onMessage() メソッドの後で consuemr に閉じるようにマーカーを使用すると、リスナーは実際に閉じる前に別のメッセージを消費する可能性があります。助言がありますか?ここにいくつかのコードがあります。Session、Connection、および InitialContext はまだ閉じられていません。

public class MyListener implements MessageListener{
    MessageConsumer consumer;

    public MyListener(MessageConsumer mc){
        consumer = mc;
    }

    @Override
    public void onMessage(Message msg) {
        try{
            if(msg instanceof ObjectMessage){
                consumer.close();
            }
            if (msg instanceof TextMessage){
                TextMessage tmsg = (TextMessage) msg;
                String xml = tmsg.getText();
                // do some stuff                
            }

       }catch(Exception e){
           e.printStackTrace();
       }
    }
4

5 に答える 5

5

非同期を使用しないでくださいMessageListener

receive代わりに、ループ内のメイン スレッドで通常の同期メソッドを使用します。特別なメッセージを受け取った場合は、確認してループから抜け出し、セッションを閉じてプログラムを終了できます。

于 2013-09-13T16:46:40.347 に答える
2

JMS 仕様に従ってconnection.stop()orconnection.close()を呼び出せないのは正しいですが、別のスレッドからandを呼び出すことはできるので、私の場合は、接続を停止する必要があるときに volatile 変数を設定し、この変数を別のスレッドで確認するだけです。例外やデッドロックを取得せずに呼び出すことができます。onMessage()connection.close()connection.stop()onMessage()connection.stop()connection.close()

> JMS 2.0 仕様より:

6.1.5. 着信メッセージの配信の一時停止 stop が呼び出されたときにいずれかのメッセージ リスナが実行されている場合、stop は、すべてのリスナが返されるまで待機してから復帰する必要があります。これらのメッセージ リスナが完了する間、接続の完全なサービスを利用できるようにする必要があります。デッドロックにつながるため、メッセージ リスナーは自身の接続を停止しようとしないでください。JMS プロバイダーはこれを検出し、javax.jms.IllegalStateException をスローする必要があります。

> JMS 1.1 から:

4.3.4 着信メッセージの配信の一時停止 stop が呼び出されたときに MessageListeners が実行されている場合、stop は、すべてのメッセージが返されるまで待機してから戻る必要があります。これらの MessageListeners が完了する間、接続の完全なサービスを利用できる必要があります。

于 2018-02-01T14:17:44.937 に答える