2017-02-23 2 views
0

Мне нужно отключить повторную доставку сообщения, когда потребитель не может обработать его и вызывает откат сеанса. Цель состоит в том, чтобы сохранить сообщение в самой очереди без повторной доставки, и мои опытные пользователи будут продолжать обрабатывать сообщения.Программно отключить сообщение ActiveMQ redelivery

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

ответ

0

К сожалению, нет решения по деактивации RedeliveryPolicy, но вы можете проектировать свой код в противном случае.

посмотрите здесь ActiveMQ redelivery does not work

возможно org.apache.activemq.ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE может помочь вам, но имейте в виду, что это:

После того, как брокер направил предвыборки предельное количество сообщений потребителя он не будет отправлен больше сообщений этому потребителю , пока потребитель не признает не менее 50% предварительно запрограммированных сообщений , например, prefetch/2, которые он получил. Когда брокер имеет , он получил упомянутые подтверждения, он отправит дополнительный запрос/2 количество сообщений потребителю для «пополнения» как бы своего буфера предварительной выборки . Обратите внимание, что можно указать префикс предварительной выборки для каждого потребителя (см. Ниже).

Другое решение предназначено для отправки сообщений в другую очередь для потребителей.

0

Ну, есть несколько трюков, которые вы можете сделать.

Типичным способом является использование встроенных функций DLQ и отправка ваших откатных сообщений в DLQ. Затем вы можете использовать любую процедуру, пытающуюся обработать эти сообщения.

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

Первый. Установите max redeliveres на один, т. Е. Сообщение будет повторено один раз.

ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
RedeliveryPolicy policy = new RedeliveryPolicy(); 
policy.setMaximumRedeliveries(1); 
cf.setRedeliveryPolicy(policy); 

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

MessageConsumer cons = sess.createConsumer(sess.createQueue("FOOBAR"), "JMSRedelivered <> true"); 

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

Смежные вопросы