я следующие два случаемпружина AMQP позволяет повторить попытку конфигурации и предотвратить его в соответствии с указанным исключением
- В случае ExceptionA: повтора для конечного числа раз и, наконец, когда количество retrials исчерпаны , сообщение записывается в мертвой очереди письма
- в случае 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();
}
, пожалуйста, проверьте редактирование исходного сообщения. –
Вам нужно установить логическое значение 'traverseCauses' в' true', потому что это исключение обернуто в 'ListenerExecutionFailedException'. Это объясняется [в документации] (http://docs.spring.io/spring-amqp//reference/html/_reference.html#_exception_classification_for_retry). –
Да, вот и все ... Но сообщение не направлено в очередь мертвых букв в обоих случаях даже с раскомментированием строки: 'recoverer (new RejectAndDontRequeueRecoverer())' –