覆盖SimpleMessageListenerContainer.setDefaultRequeueRejected(false)行为

时间:2017-01-23 09:03:16

标签: rabbitmq spring-amqp spring-rabbit

我们一直在使用框架来使用Spring AMQP,其中框架设置了SimpleMessageListenerContainer.setDefaultRequeueRejected(false),

这意味着如果从使用者处抛出异常,默认消息将不会被重新排队。

有没有办法可以在不更改SimpleMessageListenerContainer.setDefaultRequeueRejected(true)的情况下更改此行为

1 个答案:

答案 0 :(得分:0)

如果你的意思是你可以将容器设置为默认情况下没有重新排队但是因某些异常而重新排队,那么你唯一能做的就是将defaultRequeueRejected设置为true(默认值)并使用自定义错误处理程序。

默认ConditionalRejectingErrorHandler配置了默认FatalExceptionStrategy,将某些不可恢复的异常视为致命异常(消息转换异常等)。抛出这些异常时,消息将被拒绝并且不会重新排队。

您可以为错误处理程序提供自定义FatalExceptionStrategy,并且(从版本1.6.3开始)注入ConditionalRejectingErrorHandler.DefaultExceptionStrategy的子类实例并实现isUserCauseFatal() - 这允许您决定哪些例外是致命的(拒绝和不重新排队),哪些例外应该重新排队。错误处理程序通过抛出AmqpRejectAndDontRequeueException来实现这一点,这是一个信号给容器而不重新排队消息。

在1.6.3之前,您必须注入FatalExceptionStrategy的完整实现。