我们一直在使用一个框架来使用Spring AMQP,其中框架设置了SimpleMessageListenerContainer.setDefaultRequeueRejected(false),
这意味着如果消费者抛出异常,默认消息将不会被重新排队。
有什么方法可以在不更改 SimpleMessageListenerContainer.setDefaultRequeueRejected(true) 的情况下更改此行为
最佳答案
如果您的意思是您可以将容器设置为默认情况下不重新排队但在某些异常情况下重新排队,您可以做到这一点的唯一方法是将 defaultRequeueRejected
设置为 true
(默认值)并使用自定义错误处理程序。
默认的 ConditionalRejectingErrorHandler
配置有默认的 FatalExceptionStrategy
,它将某些不可恢复的异常视为致命异常(消息转换异常等)。当抛出这些异常时,消息将被拒绝并且不会重新排队。
您可以为错误处理程序提供自定义 FatalExceptionStrategy
并(自版本 1.6.3 起)注入(inject) ConditionalRejectingErrorHandler.DefaultExceptionStrategy
子类的实例并实现 isUserCauseFatal()
- 这允许您决定哪些异常是致命的(拒绝并且不重新排队)以及哪些应该重新排队。错误处理程序通过抛出 AmqpRejectAndDontRequeueException
来实现这一点,这是向容器发出的不要重新排队消息的信号。
在 1.6.3 之前,您必须注入(inject) FatalExceptionStrategy
的完整实现。
关于rabbitmq - 覆盖 SimpleMessageListenerContainer.setDefaultRequeueRejected(false) 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41802469/