spring amqp 通过配置启用重试,并根据指定的异常阻止重试

Sha*_*gab 1 spring-amqp spring-retry

我有以下两种情况

  1. 如果出现ExceptionA:重试有限次数,最后当重试次数耗尽时,消息将写入死信队列
  2. 在ExceptionB的情况下:简单来说,消息应该写入死信队列

我想在同一个侦听器容器工厂和同一个队列上支持这两种情况。

我已经有以下配置来成功支持案例 1

@Bean
public RetryOperationsInterceptor workMessagesRetryInterceptor() {
        return RetryInterceptorBuilder.stateless()
                .maxAttempts(5)
                .backOffOptions(1000, 2, 10000)
                .recoverer(new RejectAndDontRequeueRecoverer())
                .build();
    }




@Bean
public SimpleRabbitListenerContainerFactory myRabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
  SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
  factory.setConnectionFactory(connectionFactory);
  factory.setMaxConcurrentConsumers(8);
  factory.setAdviceChain(workMessagesRetryInterceptor());


  return factory;
}`
Run Code Online (Sandbox Code Playgroud)

现在我想扩展之前的配置来支持情况 2。


编辑,感谢加里的快速回复。

这是我的新配置,但我仍然对两个异常进行重试: ListenerExecutionFailedException 、 AmqpRejectAndDontRequeueException

@Bean
    public SimpleRetryPolicy rejectionRetryPolicy(){

        Map<Class<? extends Throwable> , Boolean> exceptionsMap = new HashMap<Class<? extends Throwable> , Boolean>();
        exceptionsMap.put(ListenerExecutionFailedException.class, true); //retriable
        exceptionsMap.put(AmqpRejectAndDontRequeueException.class, false);//not retriable


        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(5 , exceptionsMap );




        return retryPolicy;
    }

    @Bean
    public RetryOperationsInterceptor workMessagesRetryInterceptor() {
        return RetryInterceptorBuilder.stateless().retryPolicy(rejectionRetryPolicy())

                //.backOffOptions(1000, 2, 10000)
                //.recoverer(new RejectAndDontRequeueRecoverer())
                .build();
    }
Run Code Online (Sandbox Code Playgroud)

Gar*_*ell 5

提供SimpleRetryPolicy异常和布尔值的映射(是否重试)。您可以选择遍历异常原因树来查找特定的异常。请参阅SimpleRetryPolicy 的 Javadocs