RabbitMQ标准支持消息重试,不需要自己去写这个逻辑。如果不满足当前业务要求 那可以自己写
标准也是比较简单的
@Configuration
public class FanoutRabbitConfig {
@Autowired
private CachingConnectionFactory connectionFactory;
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
// 创建一个ConditionalRejectingErrorHandler实例,并设置恢复器
RetryOperationsInterceptor build = RetryInterceptorBuilder.stateless()
.maxAttempts(1) // 设置最大重试次数
.backOffOptions(1000, 1, 1000).recoverer(
new RejectAndDontRequeueRecoverer()).build();
// 应用重试拦截器
factory.setAdviceChain(build);
factory.setAcknowledgeMode(AcknowledgeMode.AUTO);
return factory;
}
}
这段代码就是声明一个 自动重试的 工厂 其中RejectAndDontRequeueRecoverer 是重试次数完后的策略 我这边设置的是 拒绝消息。但是请注意 想要拒绝消息 消息确认模式必须要是自动的!
手动确认 则不生效。
它有几种模式 可以具体搜一下 比如消息转发 还有简单的日志记录模式。
然后就可以在想用的@RabbitListener注解上使用了