Обратные потребители в ActiveMQ JMS API - PullRequest
0 голосов
/ 02 июля 2019

Я исследую ActiveMQ, чтобы посмотреть, будет ли он работать для проекта.Текущий вариант использования, который я должен продемонстрировать, заключается в том, что подписавшиеся позднее подписчики получат темы, опубликованные до создания подписки.Казалось, что пользователи ActiveMQ Retroactive могли бы удовлетворить эту потребность, но я не могу заставить работать код.

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("[url]");
Connection connection = connectionFactory.createConnection();
connection.start();

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

Destination destination = session.createTopic("testAddress?consumer.retroactive=true");

MessageProducer producer = session.createProducer(destination);

TextMessage message = session.createTextMessage("Hello, World!");

producer.send(message);

Thread.sleep(5000);

session.createConsumer(destination).setMessageListener(message2 -> processMessage(message2));

session.close();
connection.close();
connectionFactory.close();

Все, что я пытаюсь продемонстрировать здесь, это то, что тема может быть опубликована, а затем некоторыепроизвольное количество времени спустя (например, 5 секунд) потребитель может подписаться на тему и получить предыдущее сообщение.

Насколько я могу судить, проблема заключается в том, что при создании темы создается адрес, ноне создает никаких связанных очередей.Если я отправляю тему по адресу до того, как очередь будет создана (либо в коде, либо вручную через веб-интерфейс для брокера), сообщение, похоже, будет проигнорировано, и сразу будет увеличен "счетчик не маршрутизированных сообщений".

Документация ActiveMQ (https://activemq.apache.org/retroactive-consumer) не предоставляет более подробной информации о том, как настроить обратного пользователя, чем добавление "? Consumer.retroactive = true" при создании темы, поэтому мне интересно, есть ли некоторыедругие аспекты конфигурации, которые мне не хватает.

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Насколько мне известно, ActiveMQ Artemis не поддерживает обратную функцию потребителя, которую поддерживает 5.x.Опция на стороне клиента просто сообщает брокеру, что вы этого хотите, но поскольку Артемис не справляется с этим, вы не увидите никакой разницы от его отправки.Не следует полагаться на саму функцию в 5.x как на 100% замену долговременного потребителя, например, перезапуск брокера приведет к потере всех этих сообщений (из которых сохраненное количество является конечным).

Если вы хотите гарантировать, что вы будете получать сообщения, когда потребитель темы находится в автономном режиме, то надежный способ сделать это - надежный потребитель

0 голосов
/ 04 июля 2019

Чтобы выполнить желаемое поведение (подписчик получает темы, которые были опубликованы до подписки) в ActiveMQ Artemis, я использовал Очередь последнего значения с неразрушающим чтением. Это имеет ограничение, что я получаю только самую последнюю копию опубликованной темы, но это подойдет для моей ситуации.

...