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