Как получить старые сообщения в очереди ActiveMQ

#java #jakarta-ee #jms #activemq #producer-consumer

#java #джакарта-ee #jms #activemq #производитель-потребитель

Вопрос:

Я работаю над приложением ActiveMQ, где я использую потребителя, который использует сеанс.CLIENT_ACKNOWLEDGE.

Я отправляю сообщения, полученные из очереди в consumer, в веб-сервис.Предположим, что если я не выполняю message.confirmate(), все сообщения, отправленные в webservice, возвращаются в очередь в состоянии очереди.

Мой вопрос заключается в том, как снова извлекать сообщения из очереди и использовать их.Я использовал retroactive=true и также попробовал повторную доставку, но все они терпят неудачу.

Как этого избежать.

Ответ №1:

если вы используете message.acknowledge() все использованные сообщения, они снова не будут доступны в той же очереди, потому что они считаются доставленными!

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

В этом случае вам необходимо настроить политику предварительной выборки для потребителя на 400. Вы можете прочитать, чтобы понять концепцию http://activemq.apache.org/what-is-the-prefetch-limit-for.html

Если вы хотите обрабатывать сообщения одно за другим с помощью counter, вам нужно установить для предварительной выборки значение 1 и подтверждать каждое сообщение при обработке 200, которое вы не подтверждаете.

Комментарии:

1. Логика проста: я получаю сообщение от activemq, отправляю его в веб-сервис, если я получаю 200OK, я делаю message.confirmate(), и если я получаю что-либо, кроме 200 OK, я не хочу выполнять message.confirmate(), из-за чего сообщение возвращается в состояние очереди, и я хочу повторить попытку отправкиснова сообщение. Как это сделать

2. Я обновил свой ответ, значения по умолчанию: постоянные очереди (значение по умолчанию: 1000) непостоянные очереди (значение по умолчанию: 1000). Это означает, что если вы не подтвердите 500 первых сообщений, брокер не отправит вашему потребителю ни одного сообщения до подтверждения

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

4. можете ли вы объяснить, потому что, если потребитель подключен нормально, он получил старые сообщения, поставленные в очередь

5. public void onMessage(сообщение msg){ if (msg instanceof ActiveMQMessage){ try { //Отправить текстовое сообщение процессу (сообщение) } catch (JMSException e) { log.error(«Не удалось обработать сообщение: » сообщение msg); } } }