2017-04-08 43 views
0

jmsキューに保留中のメッセージのカウント数を取得する方法はありますか。私の目的は、処理待ちのメッセージがキューに残っていない場合に接続を閉じることです。どのように私はこれを達成することができます。jmsキューに保留中のメッセージの数を取得する方法

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 
    Connection connection = connectionFactory.createConnection("admin", "admin"); 
    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("Incoming Message:: '" + textMessage.getText() + "'"); 
     } 
    } 

答えて

-1

私がこれを行ったのは、createBrowserメソッドを使用していましたが、これは私の更新コードです。

public static void main(String[] args) throws JMSException { 
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 
Connection connection = connectionFactory.createConnection("admin", "admin"); 
connection.start(); 

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

Destination destination = session.createQueue(subject); 
int queueSize = QueueConsumer.getQueueSize(session, (Queue) destination); 
System.out.println("QUEUE SIZE: " + queueSize); 
MessageConsumer consumer = session.createConsumer(destination); 

for (int i = 0; i < queueSize; i++) { 
    Message message = consumer.receive(); 

    if (message instanceof TextMessage) { 
     TextMessage textMessage = (TextMessage) message; 
     System.out.println("Incomming Message: '" + textMessage.getText() + "'"); 
    } 
} 
connection.close(); 
} 

private int getQueueSize(Session session, Queue queue) { 
    int count = 0; 
    try { 
     QueueBrowser browser = session.createBrowser(queue); 
     Enumeration elems = browser.getEnumeration(); 
     while (elems.hasMoreElements()) { 
      elems.nextElement(); 
      count++; 
     } 
    } catch (JMSException ex) { 
     ex.printStackTrace(); 
    } 
    return count; 
} 
1

ブローカーを形成し、真のキューの数を取得する唯一の信頼できる方法は、キューにJMX MBeanを使用してgetQueueSizeメソッドを呼び出すことです。

他のプログラムによる代替方法は、ブローカーの設定を変更することができるようにすることを要求するStatistics Broker Pluginを使用することです。インストール後は、特別なメッセージを制御キューに送信し、監視する宛先の詳細を含む応答を取得できます。

QueueBrowserを使用しても、ブラウザに送信するメモリにページングするメッセージの最大数がブラウザに設定されているため、実際のカウントは得られません。実際のサイズは、最大ページサイズ制限の値だけです。

+0

答えに感謝します。私は最近、Jbossヒューズに関する作業を開始したので、私はそれについて考えていませんでした。 –

0

ただ、私はそれがここに@Tim BISH

ありがとう働いたJMXでこれを行っている

while (true) { 
    Message message = consumer.receive(2000); 
    if (message == null){ 
     break; 
    } 
    if (message instanceof TextMessage) { 
     TextMessage textMessage = (TextMessage) message; 
     System.out.println("Incoming Message:: '" + textMessage.getText() + "'"); 
    } 
    } 
    connection.close(); 
+0

デフォルトではconsumer.receive()がブロックされているため、メッセージがキューに到着するのを待つため、これは機能しませんでした。 –

+0

受信メソッドでタイムアウトを使うことができます。 – Nir

0

...ループを切断して、JMSメッセージがnullの場合は、接続をクローズすることは、私の更新されたコード

です
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://0.0.0.0:44444/jndi/rmi://0.0.0.0:1099/karaf-root"); 

HashMap<String, String[]> environment = new HashMap<String, String[]>(); 
String[] creds = { "admin", "admin" }; 
environment.put(JMXConnector.CREDENTIALS, creds); 

JMXConnector jmxc = JMXConnectorFactory.connect(url, environment); 
MBeanServerConnection connection = jmxc.getMBeanServerConnection(); 

ObjectName nameConsumers = new ObjectName("org.apache.activemq:type=Broker,brokerName=amq,destinationType=Queue,destinationName=myqueue"); 
DestinationViewMBean mbView = MBeanServerInvocationHandler.newProxyInstance(connection, nameConsumers, DestinationViewMBean.class, true); 
long queueSize = mbView.getQueueSize(); 
System.out.println(queueSize); 
関連する問題