2016-09-01 6 views
0

я следующие два случаемпружина AMQP позволяет повторить попытку конфигурации и предотвратить его в соответствии с указанным исключением

  1. В случае ExceptionA: повтора для конечного числа раз и, наконец, когда количество retrials исчерпаны , сообщение записывается в мертвой очереди письма
  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; 
}` 

Теперь я хочу, чтобы расширить предыдущую конфигурацию, чтобы поддержать случай-тоже.


Редактировать, спасибо Гэри за ваш быстрый ответ.

Здесь моя новая конфигурация, но я до сих пор получить retrials на обоих двумя исключениями: 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(); 
    } 

ответ

2

Обеспечить SimpleRetryPolicy с картой исключений и булевы (или не повторить). Вы можете, по желанию, обработать дерево причин исключения, чтобы найти конкретное исключение. См. Javadocs for SimpleRetryPolicy.

+0

, пожалуйста, проверьте редактирование исходного сообщения. –

+0

Вам нужно установить логическое значение 'traverseCauses' в' true', потому что это исключение обернуто в 'ListenerExecutionFailedException'. Это объясняется [в документации] (http://docs.spring.io/spring-amqp//reference/html/_reference.html#_exception_classification_for_retry). –

+0

Да, вот и все ... Но сообщение не направлено в очередь мертвых букв в обоих случаях даже с раскомментированием строки: 'recoverer (new RejectAndDontRequeueRecoverer())' –