Поиск, содержит ли очередь больше элементов

#java #activemq

#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();
 

Ответ №1:

Похоже, вам нужен другой поток. Как вы узнаете, когда нужно закончить прослушивание? Если это где 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:

Ну, как долго вы хотите ждать поступления новых сообщений? Если нет никакой гарантии, что больше сообщений не может поступать, вы не можете сказать, когда это «сделано».

Вы можете указать тайм-аут receive() или вызвать receiveNoWait() и прервать, если возвращаемое значение равно null , что означает, что за данный период времени сообщение не было доступно.

Ответ №3:

На самом деле у вас есть несколько вариантов для определения того, что доступно для данного назначения в ActiveMQ. Брокер предоставляет много информации о JMX, поэтому, если вас это устраивает, вы можете подключиться и получить количество сообщений, которые поставлены в очередь. Другой вариант, который не требует использования JMX, — это использовать плагин статистики брокера. Этот плагин позволяет отправлять сообщение брокеру с набором ReplyTo назначения, и он ответит сообщением, содержащим текущую статистику назначения. Смотрите Документацию для плагина статистики здесь .