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

Это определенно будет работать.

Другие вопросы по тегам