Повторите настройку для @RabbitListener, программно указав очередь недоставленных сообщений

Я пытался найти способ установить механизм повтора для всех @RabbitListener. Я уже пробовал со свойствами:

listener:
  auto-startup: true
  concurrency: 1
  max-concurrency: 1
  retry:
    enabled: true
    initial-interval: 1000
    max-attempts: 3
    max-interval: 10000
    multiplier: 2
    stateless: true

И это прекрасно работает, одна только проблема заключается в том, что вместе с сообщением не отправляется сообщение об ошибке. Единственная проблема, которая у меня есть, заключается в том, что для отправки сообщений определенному DLQ мне нужно изменить свои очереди, чтобы добавить аргументы x-dead-letter-exchange и x-dead-letter-routing-key, и этого я хотел бы избежать.

Итак, мои вопросы:

  1. Есть ли способ программно указать, какой DLQ куда должны отправляться сообщения после исчерпания попыток без повторного создания очередей? Без использования аргументов x-dead-...

Я использую Spring Boot 1.4.0.RELEASE.


person Andrés Soto    schedule 01.09.2016    source источник


Ответы (1)


Не через свойства.

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

builder.recoverer(new RejectAndDontRequeueRecoverer());

вам нужно внедрить правильно настроенный RepublishMessageRecoverer - помимо публикации на выбранном вами обмене, он добавляет дополнительную информацию (трассировка стека и т. д.) в заголовки сообщений.

См. SimpleRabbitListenerContainerFactoryConfigurer, чтобы узнать, как перехватчик по умолчанию построен из свойств.

Восстановитель повторной публикации обсуждается в этом разделе Spring AMQP. документы.

person Gary Russell    schedule 01.09.2016