АктивМК:как удалить из очереди старые сообщения?

StackOverflow https://stackoverflow.com/questions/1839444

  •  12-09-2019
  •  | 
  •  

Вопрос

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

Предположим, что у меня есть тема с именем theme.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, чтобы мои потребители могли получать более старые сообщения?

Это было полезно?

Решение

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top