2017-04-08 93 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

只是打破循環並關閉連接,如果你的JMS消息爲空..

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

我已經使用JMX做到了這一點,它的工作感謝名單@Tim BISH

這裏是我更新的代碼

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);