rabbitmq - 覆盖 SimpleMessageListenerContainer.setDefaultRequeueRejected(false) 行为

标签 rabbitmq spring-amqp spring-rabbit

我们一直在使用一个框架来使用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/

相关文章:

php - 与 RabbitMQ 的主题交换歧义

java - 执行器服务 RabbitMQ 中只有一个线程同时运行

java - Spring AMQP - 在启动时将队列注册到容器的正确方法

java - 不同队列的多个监听器 - Spring Rabbit

java - @RabbitListener 以 "stopped"模式开始绑定(bind)到扇出交换

java - SimpleMessageListenerContainer - 消费者引发异常,如果连接工厂支持,处理可以重新启动

RabbitMQ 上的 Autoconfigure 的 Spring Boot 启动失败

python - 超时后,Celery 没有将任务放回 RabbitMQ 队列

java - 在 Spring Boot AMQP 中为 RabbitMQ 配置 ConnectionFactory

java - Spring Integration - header 丢失