2017-01-23 7 views
1

Мы используем рамки для использования Spring AMQP, где рамки установить SimpleMessageListenerContainer.setDefaultRequeueRejected (ложь),Override SimpleMessageListenerContainer.setDefaultRequeueRejected (ложь) поведение

Это означает, по умолчанию сообщения не будут Requeued, если бросать исключение из потребителя.

Есть ли способ, что я могу изменить это поведение, не изменяя SimpleMessageListenerContainer.setDefaultRequeueRejected (истинную)

ответ

0

Если вы имеете в виду вы можете установить контейнер не снова поставить по умолчанию, но для некоторых снова поставить исключение, единственным способом вы можете сделайте это, чтобы установить defaultRequeueRejected в true (по умолчанию) и использовать собственный обработчик ошибок.

По умолчанию ConditionalRejectingErrorHandler настроен по умолчанию FatalExceptionStrategy, который обрабатывает определенные неустранимые исключения как фатальные (исключения для преобразования сообщений и т. Д.). Когда эти исключения выдаются, сообщение отклоняется и не запрашивается.

Вы можете предоставить пользовательский FatalExceptionStrategy для обработчика ошибок и (начиная с версии 1.6.3) впрыснуть экземпляр подкласса ConditionalRejectingErrorHandler.DefaultExceptionStrategy и реализации isUserCauseFatal() - это позволяет определить, какие исключения являются фатальными (отвергаем и не снова поставить) и которые должны быть предъявлены. Обработчик ошибок достигает этого, бросая AmqpRejectAndDontRequeueException, который является сигналом к ​​контейнеру, чтобы не требовать сообщения.

Перед тем, как 1.6.3, вам необходимо было ввести полную реализацию FatalExceptionStrategy.