确保RabbitMQ消息发送可靠性一般来说有两个方法,一个是RabbitMQ事务,另一个是RabbitMQ发送方确认机制
一、RabbitMQ事务
配置事务管理器
测试代码:
事务模式效率有点低,一般使用发送方确认机制
二、RabbitMQ发送方确认机制
RabbitMQ发送方确认机制说白了就是一个回调,起到一个通知作用
一般确保消息发送的可靠性只要注意两个点,一个是消息是否到达交换机,另一个是消息是否会从交换机到达队列,如果Java代码不出错的前提下,前者受网络影响较大。
配置发送方确认:(注:不可与事务同时存在)
重新配置RabbitTemplate:
@Configuration
public class RabbitTemplateConfig implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback {
@Autowired
RabbitTemplate rabbitTemplate;
/**
* @PostConstruct 注解表示构造方法执行完毕之后,就会自动调用 init 方法
*/
@PostConstruct
public void init() {
rabbitTemplate.setConfirmCallback(this);
rabbitTemplate.setReturnsCallback(this);
}
/**
* 消息是否到达交换机的回调
*
* @param correlationData
* @param ack
* @param cause
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (ack) {
System.out.println("消息已到达交换机:" + correlationData.getId());
} else {
//消息未到交换机,如果需要重试,就可以在这里进行配置了
System.out.println("消息没有到达交换机:" + cause);
}
}
/**
* 消息被退回的回调,即消息为成功到达队列的回调
* <p>
* 相当于消息如果没有到达队列,则这个方法会被触发
*
* @param returned
*/
@Override
public void returnedMessage(ReturnedMessage returned) {
System.out.println("消息未到达队列:" + returned.toString());
}
}
发送消息:
把队列写错:
把交换机写错:
消息重试机制
1.自带重试机制
消息重试机制,用于处理消息到交换机过程中由于网络不稳定而产生的消息发送失败问题
消息重试配置:
2.业务重试机制