4

我正在使用 Active MQ 和 Java JMS。

我想计算队列中的消息数。

一种方法是使用浏览器计算消息:

    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。

另一种方法是(迭代队列中的所有消息):

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 队列中等待的消息?

4

2 回答 2

7

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

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

于 2012-12-03T16:33:43.197 回答
1

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

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

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

于 2012-12-03T13:42:00.093 回答