2011-10-28 12 views
1

次のコードがあります。私はキューにアクセスしようとしているリソースを消費しようとしていますが、どれくらい多くの要素がキューにあり、何個残っているのかわからないので、while(true)を実行していますが、この場合は、プロセスは死ぬことはありません。私はそれを停止したにもかかわらず。キューに追加の要素があるかどうかを調べる

キューにアイテムがさらに含まれている場合は、どうすれば見つけることができますか?私はActiveMqQueueBrowserを見ましたが、内部は本当に簡単に使えません。

あなたは何をしますか?あなたは何をお勧めしますか?

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 
    Connection connection = connectionFactory.createConnection(); 
    connection.start(); 

    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

    Destination destination = session.createQueue(subject); 

    MessageConsumer consumer = session.createConsumer(destination); 

    while(true){ 
      Message message = consumer.receive(); 

      if (message instanceof TextMessage) { 
       TextMessage textMessage = (TextMessage) message; 
       System.out.println("message from queue : '" + textMessage.getText() + "'"); 
      } 
    } 

    // unreachable code. compiler complains. 
    // connection.close(); 
+0

これは有料ですか? – KarlP

答えて

0

他のスレッドが必要です。どのように聞くことができるのかをどのように知っていますか?そのconsumerQueueはもはや価値を有している場合場合は、これを試していない:

while(true){ 
     Message message = consumer.receive(//some int timeout); 
     if (message == null) 
     { 
      break; 
     } 

     if (message instanceof TextMessage) { 
      TextMessage textMessage = (TextMessage) message; 
      System.out.println("message from queue : '" + textMessage.getText() + "'"); 
     } 
} 

そうでない場合は、あなたが正しいと、ループが返すことはありません、あなたが勝った; tはJVMがダウンしていたときに正しく接続を閉じることができ。

0

さらにメッセージが届くのをどれくらい待っていますか?それ以上のメッセージが届かないという保証がない限り、「完了した」ときは本当に言うことができません。

タイムアウトをに設定するか、receiveNoWait()にコールし、戻り値がnullの場合、指定した期間内にメッセージが利用できないことを意味します。

+0

あなたの言っていることが分かります。ありがとう – user1019164

0

実際には、ActiveMQの特定の宛先で利用できるものを判断するためのオプションがいくつかあります。ブローカはJMXに関する多くの情報を公開しています。もしあなたがそれに慣れていれば、接続して待ち行列に入れられるメッセージの数を得ることができます。 JMXを使用しない別のオプションは、Broker Statisticsプラグインを使用することです。このプラグインを使用すると、ReplyTo宛先が設定されたブローカにメッセージを送信することができ、宛先の現在の統計情報を含むメッセージで応答します。統計プラグインhereのドキュメントを参照してください。

関連する問題