【问题标题】:How To count Number of queues in ACTIVEMQ如何计算 ACTIVEMQ 中的队列数
【发布时间】:2015-04-04 21:37:14
【问题描述】:

我正在尝试创建一个应用程序,它会不断检查在 activemq 中启动和运行的队列数量。 以及检查队列是否正常工作的任何方法,即是否已损坏且无法处理消息。 请建议如何做。

提前致谢。

【问题讨论】:

    标签: java activemq jmx


    【解决方案1】:

    您可以使用代理上的statistics plugin 和纯 JMS api 来询问统计信息。 IE。要计算 FOO.BAR 上的消息数量,请向ActiveMQ.Statistics.Destination.TEST.FOO 发送空消息并指定replyTo 标头。在类型为 MapMessage 的响应消息中,您可以找到消息计数器。

    另一种方法是使用简单的队列浏览器仅浏览队列的第一条消息(类似于 praveen_programmer 建议的方式)并检查该消息的时间戳。如果它超过某个阈值,您可能会遇到该消费者的问题。 IE。在过去的一小时/分钟/天没有处理任何消息。

    还有一种方法是使用JMX,或者最好是jolokia REST/HTTP management api

    只需使用 http 查询目的地,即可获得队列深度: 要在 localhost 上查询队列“q”,请使用以下 api(您需要为 Web 控制台提供用户/密码): http://localhost:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=q

    【讨论】:

      【解决方案2】:

      查看咨询消息。您需要在您的配置中启用它们,但是您可以通过简单的 JMS 消息传递获得有关当前 activemq 实例信息的很多有用信息。 http://activemq.apache.org/advisory-message.html 我用它们来突出缓慢的生产者和消费者场景。

      【讨论】:

        【解决方案3】:

        你可以试试下面的代码。

        public static void main(String[] args) throws Exception
            {
                // get the initial context
                InitialContext ctx = new InitialContext();
        
                // lookup the queue object
                Queue queue = (Queue) ctx.lookup("queue/queue0");
        
                // lookup the queue connection factory
                QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.
                    lookup("queue/connectionFactory");
        
                // create a queue connection
                QueueConnection queueConn = connFactory.createQueueConnection();
        
                // create a queue session
                QueueSession queueSession = queueConn.createQueueSession(false,
                    Session.AUTO_ACKNOWLEDGE);
        
                // create a queue browser
                QueueBrowser queueBrowser = queueSession.createBrowser(queue);
        
                // start the connection
                queueConn.start();
        
                // browse the messages
                Enumeration e = queueBrowser.getEnumeration();
                int numMsgs = 0;
        
                // count number of messages
                while (e.hasMoreElements()) {
                    Message message = (Message) e.nextElement();
                    numMsgs++;
                }
        
                System.out.println(queue + " has " + numMsgs + " messages");
        
                // close the queue connection
                queueConn.close();
            }
        

        【讨论】:

        • 请注意,消息浏览器并不总是提供队列中的所有消息。默认情况下,ActiveMQ 的浏览限制为 400 条消息。所以这个答案无法区分 400 和 100 000 条消息。此外,对于大型消息,它非常慢,因为它要求您全部下载它们只是为了计算它们。
        猜你喜欢
        • 2019-11-24
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 2016-08-04
        • 2018-02-20
        • 1970-01-01
        • 2013-11-22
        • 2012-11-16
        相关资源
        最近更新 更多