2012-12-03 54 views
4

我正在使用Active MQ和Java JMS。在JMS队列上计算消息时出现奇怪行为

我想统计队列中消息的数量。

一种方法是计数messeages使用浏览器:

Queue queue = (Queue) session.createQueue(subject); 
    QueueBrowser queueBrowser = session.createBrowser(queue); 
    Enumeration<?> e = queueBrowser.getEnumeration(); 
    int numMsgs = 0; 
    // count number of messages 
    while (e.hasMoreElements()) { 
    // Message m = (Message) e.nextElement(); 
     e.nextElement(); 
     numMsgs++; 
    } 

但对于5000个未决请求队列中,这只是返回500

另一种做法是这样的(重复的所有messeages队列):

Message message= consumer.receive(500); 
while(message!= null) 
    { 

     if (message instanceof TextMessage) 
     { 
      TextMessage textMessage = (TextMessage) message; 
     //  BytesMessage Byte 

      System.out.println("Received message '"+ textMessage.getText() + "'"); 
     } 
     if(message!=null) 
      Messages_list.add(message); 

     message = consumer.receive(1); 
    } 

但是,这也不会给出适量的消息挂起。

我该如何自信地迭代队列中等待的消息?

+0

非常奇怪的行为,我一直有与QueueBrowser很好的经验。愚蠢的问题,但仍然 - 你确定你正在寻找正确的队列?你是如何确定有5000条消息的?例如,Glassfish附带的“Imqadmin”通常没有关于消息的最新信息。 –

回答

7

ActiveMQ中存在一个阻止浏览返回实际消息数的错误。在这种情况下,浏览只返回单页的消息,这是由maxPageSize属性设置并在此处记录:http://activemq.apache.org/per-destination-policies.html

ActiveMQ目前在此问题上有一个错误报告,它在此处被跟踪:https://issues.apache.org/jira/browse/AMQ-4181。此问题已得到解决,目前计划在ActiveMQ 5.8.0中解决。

+0

所以我想这只是队列中的第200条消息,你将无法检索最近的200条消息:(?... –

1

由于您使用ActiveMQ的,你可以使用ActiveMQ的StatisticsPlugin的:http://activemq.apache.org/statisticsplugin.html

同样,用来查询目的地的统计只将消息发送到与ActiveMQ.Statistics.Destination前缀的目的地名称。例如,要检索队列名为TEST.FOO统计,发送一个空的消息,一个名为ActiveMQ.Statistics.Destination.TEST.FOO

具体的队列,你可能会感兴趣的enqueueCount。 我在这里省略了示例代码,因为插件网页上的示例代码简洁而优秀。