如何在RabbitMQ中实现重试逻辑



在我的项目中,我将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在有限的时间内重试,DoNotRetryGException发送到DLQ

请帮助解决这个问题,如果需要,我会附上回购链接。

https://github.com/aviralnimbekar/RabbitMQ/tree/main/src

您的GlobalErrorHandler在重试发生之前执行其逻辑,并用AmqpRejectAndDontRequeueException覆盖异常。看起来你在DLX上发布了一个。考虑将您的GlobalErrorHandler逻辑移动到更通用的ErrorHandler,以代替factory.setErrorHandler();

查看文档中的更多信息:https://docs.spring.io/spring-amqp/reference/html/#exception-处理

更新

从你的@RabbitListener中删除errorHandler = "globalErrorHandler"后,我在日志中得到了这个:

2022-08-03 16:02:08.093  INFO 16896 --- [nio-8080-exec-4] c.t.r.producer.RabbitMQProducer          : Message sent -> retry
2022-08-03 16:02:08.095  INFO 16896 --- [ntContainer#0-1] c.t.r.consumer.RabbitMQConsumer          : Retrying message...
2022-08-03 16:02:10.096  INFO 16896 --- [ntContainer#0-1] c.t.r.consumer.RabbitMQConsumer          : Retrying message...
2022-08-03 16:02:13.099  INFO 16896 --- [ntContainer#0-1] c.t.r.consumer.RabbitMQConsumer          : Retrying message...
2022-08-03 16:02:13.100  WARN 16896 --- [ntContainer#0-1] o.s.a.r.retry.RepublishMessageRecoverer  : Republishing failed message to exchange 'dlExchange' with routing key dlRoutingKey
2022-08-03 16:02:17.736  INFO 16896 --- [nio-8080-exec-5] c.t.r.producer.RabbitMQProducer          : Message sent -> 1231231
2022-08-03 16:02:17.738  INFO 16896 --- [ntContainer#0-1] c.t.r.consumer.RabbitMQConsumer          : sending into dlq...
2022-08-03 16:02:17.739  WARN 16896 --- [ntContainer#0-1] o.s.a.r.retry.RepublishMessageRecoverer  : Republishing failed message to exchange 'dlExchange' with routing key dlRoutingKey

这肯定反映了您最初的要求。

最新更新