spring amqp 通过配置启用重试并根据指定的异常阻止它
spring amqp enable retry by configuration and prevent it according to a specified exception
我有以下两种情况
- 在 ExceptionA 的情况下:重试有限次数
最后当重试次数用完时,消息被写入
死信队列
- 在 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;
}`
现在我想扩展以前的配置来支持案例 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();
}
为 SimpleRetryPolicy
提供异常和布尔值映射(是否重试)。您可以选择遍历异常原因树来查找特定异常。见 Javadocs for SimpleRetryPolicy.
我有以下两种情况
- 在 ExceptionA 的情况下:重试有限次数 最后当重试次数用完时,消息被写入 死信队列
- 在 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;
}`
现在我想扩展以前的配置来支持案例 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();
}
为 SimpleRetryPolicy
提供异常和布尔值映射(是否重试)。您可以选择遍历异常原因树来查找特定异常。见 Javadocs for SimpleRetryPolicy.