Поиск, есть ли в очереди больше элементов - PullRequest
1 голос
/ 29 октября 2011

У меня есть следующий код. Я пытаюсь получить доступ к очереди и использовать ресурсы, ну, я не знаю, сколько элементов в очереди и сколько осталось, поэтому я делаю 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 голосов
/ 29 октября 2011

Похоже, вам нужен другой поток. Откуда ты знаешь, когда нужно закончить прослушивание? Если там, где customerQueue больше не имеет значения, попробуйте это:

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 выйдет из строя.

0 голосов
/ 29 октября 2011

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

0 голосов
/ 29 октября 2011

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

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

...