#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 назначения, и он ответит сообщением, содержащим текущую статистику назначения. Смотрите Документацию для плагина статистики здесь .