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

Java 查找队列是否包含更多元素,java,activemq,Java,Activemq,我有以下代码。我试图访问一个队列并消耗资源,我不知道队列中有多少元素,还有多少元素,所以我做了一些事情,但在这种情况下,我无法关闭连接,这会导致错误,稍后,就像进程不会死一样。即使我阻止了它 如何找到队列中是否有更多项目,然后执行以下操作?我看了ActiveMqQueueBrowser,但它是内部的,所以我不能很容易地使用它 你会怎么做?你推荐什么 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ur

我有以下代码。我试图访问一个队列并消耗资源,我不知道队列中有多少元素,还有多少元素,所以我做了一些事情,但在这种情况下,我无法关闭连接,这会导致错误,稍后,就像进程不会死一样。即使我阻止了它

如何找到队列中是否有更多项目,然后执行以下操作?我看了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();

那么,您要等待多长时间才能收到更多消息?除非有任何保证,没有更多的消息可以进来,你不能真正说什么时候完成


如果返回值为空,则可以为接收或调用receiveNoWait和break设置超时,这意味着在给定的时间段内没有可用的消息。

听起来您需要另一个线程。你怎么知道什么时候该听呢?如果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关闭时,您无法正确地关闭连接。

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