对 JMS 队列上的消息进行计数时的奇怪行为

Posted

技术标签:

【中文标题】对 JMS 队列上的消息进行计数时的奇怪行为【英文标题】:Weird behavior when counting messages on JMS queue 【发布时间】:2012-11-20 16:33:10 【问题描述】:

我正在使用 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 队列中等待的消息?

【问题讨论】:

非常奇怪的行为,我一直对 QueueBrowser 有很好的体验。愚蠢的问题,但仍然 - 你确定你正在寻找正确的队列吗?您是如何确定有 5000 条消息的?例如,Glassfish 附带的Imqadmin 通常没有关于 nr 消息的最新信息。 【参考方案1】:

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

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

【讨论】:

所以我猜这只是队列中的前 200 条消息,您将无法检索最近的 200 条消息 :( ?...【参考方案2】:

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

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

具体来说,您可能对enqueueCount 感兴趣。 此处省略示例代码,因为插件网页上的示例代码简洁又好。

【讨论】:

以上是关于对 JMS 队列上的消息进行计数时的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

Java消息队列--JMS概述

Java消息队列--JMS概述

Java消息队列--JMS概述

一条 JMS 消息复制到两个队列

从JMS到KafKa

Mule 在变压器中使用 JMS 连接器