计算JMS队列上的消息时的奇怪行为

时间:2012-12-03 08:12:48

标签: java jms activemq message-queue

我正在使用Active MQ和Java 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。

另一种方法是这样做(迭代队列中的所有messeage):

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

但是这也没有给出正确数量的消息。

我如何可靠地迭代akk在队列中等待的消息?

2 个答案:

答案 0 :(得分:7)

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

ActiveMQ目前有关于此问题的错误报告,并且正在此处跟踪:https://issues.apache.org/jira/browse/AMQ-4181。此问题已得到解决,目前计划在ActiveMQ 5.8.0中修复。

答案 1 :(得分:1)

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

  

同样,要查询目标的统计信息,只需将消息发送到ActiveMQ.Statistics.Destination前面的目标名称。例如,要检索名称为TEST.FOO的队列的统计信息,请将空消息发送到名为ActiveMQ.Statistics.Destination.TEST.FOO的队列

具体来说,您可能对enqueueCount感兴趣。 我在这里省略了示例代码,因为插件网页上的示例代码简洁而且很好。