在我的项目中,我设置了SimpleRetryPolicy
来添加自定义异常和使用此策略的RetryOperationsInterceptor
。
@Bean
public SimpleRetryPolicy rejectionRetryPolicy() {
Map<Class<? extends Throwable>, Boolean> exceptionsMap = new HashMap<Class<? extends Throwable>, Boolean>();
exceptionsMap.put(DoNotRetryException.class, false);//not retriable
exceptionsMap.put(RetryException.class, true); //retriable
return new SimpleRetryPolicy(3, exceptionsMap, true);
}
@Bean
RetryOperationsInterceptor interceptor() {
return RetryInterceptorBuilder.stateless()
.retryPolicy(rejectionRetryPolicy())
.backOffOptions(2000L, 2, 3000L)
.recoverer(
new RepublishMessageRecoverer(rabbitTemplate(), "dlExchange", "dlRoutingKey"))
.build();
}
但是,使用这些配置,重试对于RetryException和DoNotRetryException都不起作用,我希望RetryException重试有限次,DoNotRetryException发送到DLQ
请帮助的问题,我附上回购链接,如果在需要的情况下。
https://github.com/aviralnimbekar/RabbitMQ/tree/main/src
1条答案
按热度按时间2wnc66cl1#
您的
GlobalErrorHandler
在重试发生之前执行其逻辑,并且您用AmqpRejectAndDontRequeueException
覆盖了那里的异常。看起来您在那里执行了到DLX的发布。请考虑将您的GlobalErrorHandler
逻辑移动到factory.setErrorHandler();
的更通用的ErrorHandler
。更多信息请参阅文档:https://docs.spring.io/spring-amqp/reference/html/#exception-handling
更新
在从您的
@RabbitListener
中删除errorHandler = "globalErrorHandler"
后,我在日志中得到了以下内容:这绝对反映了你最初的要求。