查找队列是否包含更多元素

时间:2011-10-28 21:56:54

标签: java activemq

我有以下代码。我试图访问队列并消耗资源,我不知道队列中有多少元素和剩余多少元素,所以我正在做while(true)但是在这种情况下,我无法关闭导致错误的连接,稍后,就像过程不会死。即使我停止了它。

如何查找队列中是否有更多项目,然后执行以下操作?我看了一下ActiveMqQueueBrowser,但它是内部的,所以我不能轻易地使用它。

你会做什么?你推荐什么?

    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
    Connection connection = connectionFactory.createConnection();
    connection.start();

    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    Destination destination = session.createQueue(subject);

    MessageConsumer consumer = session.createConsumer(destination);

    while(true){
            Message message = consumer.receive();

            if (message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage) message;
                System.out.println("message from queue : '" + textMessage.getText() + "'");
            }
    }

   // unreachable code. compiler complains.
   // connection.close();

3 个答案:

答案 0 :(得分:0)

您希望等待更多邮件到达多长时间?除非能保证不再有任何消息可以进入,否则你无法真正说出它何时“完成”。

您可以向receive()发出超时或致电receiveNoWait(),如果返回值为null则中断,这意味着在给定时间段内没有可用消息。

答案 1 :(得分:0)

听起来你需要另一个线程。你怎么知道什么时候听?如果consumerQueue不再具有值,请尝试:

while(true){
        Message message = consumer.receive(//some int timeout);
        if (message == null)
        {
            break;
        }

        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            System.out.println("message from queue : '" + textMessage.getText() + "'");
        }
}

否则你是对的,循环将永远不会返回而你赢了;当JVM关闭时,能够正确关闭连接。

答案 2 :(得分:0)

您实际上有几个选项可用于确定ActiveMQ中给定目标上的可用内容。该代理公开了JMX的大量信息,因此如果您对此感到满意,您可以连接并获取入队的消息数量。不涉及使用JMX的另一个选项是使用Broker Statistics插件。此插件允许您使用ReplyTo目标集向代理发送消息,并且它将使用包含Destination的当前统计信息的消息进行响应。请参阅统计信息插件here的文档。