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

时间:2016-09-01 13:19:39

标签: spring-amqp spring-retry

我有以下两种情况

  1. 如果 ExceptionA :重试有限次数 最后,当重试次数耗尽时,会写入消息 死信队列
  2. 如果是 ExceptionB :简单地说,应该写入消息 死信队列
  3. 我想在同一个侦听器容器工厂和同一个队列中支持这两种情况。

    我已经有以下配置成功支持案例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;
    }`
    

    现在我想扩展先前的配置以支持案例2。

    编辑,感谢Gary的快速反应。

    在这里,您是我的新配置,但在两个例外情况下我仍然获得重审: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();
        }
    

1 个答案:

答案 0 :(得分:3)

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