2017-05-21 2 views
0

接続が作成され、セッションが確立された後、一定量のメッセージをキューから取得する必要があります。非同期メッセージリスナーの場合、接続をいつ終了するのか?

public class Consumer { 
    public static void main(String[] args) throws JMSException { 
     Consumer consumer = new Consumer(); // creates a connection and session 

     Destination destination = consumer.getSession().createQueue("JOBS"); 
     MessageConsumer messageConsumer = consumer.getSession().createConsumer(destination); 
     messageConsumer.setMessageListener(new Listener(job)); // asynchronous listener. 

     consumer.close(); // closes the connection 
    } 
} 

いつ接続を閉じることができますか?上記のようにすると、1つのメッセージだけが読み込まれるためです。 上記のように接続を終了しないと、すべてのメッセージが読み込まれるため、正常ですが接続は開いたままです。

答えて

0

接続をいつ終了するかはあなた次第です。

あなたが閉じる前のThread.sleepを追加したり、ジャムが停止したときに閉じるようにshutdownHookを追加することができます。

Thread shutdownHook = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      consumer.close(); 
     } 
    }); 

Runtime.getRuntime().addShutdownHook(shutdownHook); 

別のアプローチ:

最大非アクティブ時間(前ソケットは、ミリ秒で 死んだと見なされます)。いくつかのプラットフォームでは、 ソケットが消滅しているように見えるのに時間がかかることがあります。したがって、一定期間ブローカが接続を切断することを許可しています( )。いくつかの輸送手段を使って キープアライブハートビート機能を有効にする。 = 0に設定すると、非アクティビティ監視の が無効になります。

あなたはMQブローカーとの接続を作成するときは、あなたがより多くのために、このActiveMQのドキュメントを読む

このような
cf = new ActiveMQConnectionFactory(
    "tcp://localhost:61616?wireFormat=openwire&wireFormat.maxInactivityDuration=value"); 

を作成する必要があり、このため、wireFormat.maxInactivityDurationを使用して接続のための最大の非活動期間を指定することができます詳細http://activemq.apache.org/cms/configuring.html

関連する問題