ActiveMQ слушатель регистра StompConnection
Я использую вариант примера по адресу http://svn.apache.org/repos/asf/activemq/trunk/assembly/src/release/example/src/StompExample.java для получения сообщения из очереди. То, что я пытаюсь сделать, это продолжать слушать очередь и выполнять некоторые действия после получения нового сообщения. Проблема в том, что я не смог найти способ зарегистрировать слушателя ни для одного из связанных объектов. Я пробовал что-то вроде:
public static void main(String args[]) throws Exception {
StompConnection connection = null;
try {
connection = new StompConnection();
connection.open("localhost", 61613);
connection.connect("admin", "activemq");
connection.subscribe("/queue/worker", Subscribe.AckModeValues.AUTO);
while (true) {
StompFrame message = connection.receive();
System.out.println(message.getBody());
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
но это не работает, так как время ожидания наступает через несколько секунд (java.net.SocketTimeoutException: Read timed out
). Что я могу сделать, чтобы бесконечно слушать эту очередь?
3 ответа
Класс StompConnection ActiveMQ является относительно примитивным клиентом STOMP. Он не способен выполнять асинхронные обратные вызовы в Message или неопределенное ожидание. Вы можете передать тайм-аут на получение, но в зависимости от того, используете ли вы STOMP v1.1, он все еще может истечь раньше времени, если сердцебиение не будет получено вовремя. Конечно, вы всегда можете перехватить исключение тайм-аута и повторить попытку.
Для STOMP через Java вам лучше использовать StompJMS или что-то подобное, которое ведет себя как настоящий JMS-клиент и позволяет получать асинхронные сообщения.
@ Тим Биш: я попробовал StompJMS, но не смог найти ни одного примера, который мог бы использовать (возможно, вы можете предоставить ссылку). Я "исправил" проблему, установив таймаут на 0, который кажется блокирующим.
Даже я столкнулся с той же проблемой.. вы можете исправить это, добавив время для вашего метода receive().
Объявите переменную длинного типа.
long waitTimeOut = 5000; //this is 5 seconds
Теперь измените вашу функцию приема, как показано ниже.
StompFrame message = connection.receive(waitTimeOut);
Это определенно будет работать.