ActiveMQ: как убрать старые сообщения? - PullRequest
4 голосов
/ 03 декабря 2009

Я изучаю, как использовать ActiveMQ, и теперь мы столкнулись со следующей проблемой.

Предположим, у меня есть тема с именем topic.test в ActiveMQ, у которой есть два подписчика. В данный момент у меня есть только один подписчик, ожидающий сообщений, и продюсер отправляет сообщение по теме, о которой я говорил выше.

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

Вот часть исходного кода, который я написал для тестирования ActiveMQ. Может быть, вы могли бы найти, что с ним не так.

Мой потребительский код:

        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection connection = connectionFactory.createConnection();
        connection.setClientID("leitorTeste");
        conexao.start();
        Session sessao = conexao.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Topic fonte = sessao.createTopic("topic.test");
        MessageConsumer consumer = sessao.createConsumer(fonte);
        javax.jms.Message presente = null;
        while ((presente = consumer.receive()) != null) {
            System.out.println(((TextMessage) presente).getText());
        }
        consumer.setMessageListener(new LeitorMensagens());
        conexao.close();

А вот мой код производителя:

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection connection = connectionFactory.createConnection();
        Session sessao = conexao.createSession(true, Session.AUTO_ACKNOWLEDGE);
        connection.start();
        Destination destino = sessao.createTopic("topic.test");
        MessageProducer produtorMensagem = sessao.createProducer(destino);
        produtorMensagem.setDeliveryMode(DeliveryMode.PERSISTENT);
        TextMessage message = sessao.createTextMessage("Hi!");
        produtorMensagem.send(message);
        sessao.commit();
        connection.close();

Есть ли какая-либо другая конфигурация, которую я должен добавить в ActiveMQ, чтобы мои потребители могли получать старые сообщения?

Ответы [ 2 ]

6 голосов
/ 03 декабря 2009

Вы должны сделать своих потребителей «постоянными». В противном случае AMQ «забывает» о них, как только они отписываются. Для этого используйте Session.createDurableSubscriber()

1 голос
/ 31 декабря 2009

Существует так называемая политика обратного пользователя , которую вы также можете установить в брокере. Это для подписчиков тем - которые недолговечны, но могут пожелать получать «последние» сообщения, которые они могли пропустить - см. Также Политика восстановления подписки

...