目录
1. 消息的发送确认
生产者发送消息,先将消息发送到 Exchange
,然后由 Exchange
再路由到 Queue
,这中间就需要确认两个事情
- 确认消息是否成功发送到
Exchange
- 确认消息是否从
Exchange
成功路由到Queue
Spring
提供了两个 回调函数
来处理这两种消息发送确认
1.1. 确认消息是否成功发送到 Exchange
一般会采用轻量级的 Confirm
确认机制,跟手动 Ack
机制类似。生产者将消息发送到 RabbitMQ
,且将消息持久化到硬盘后,RabbitMQ
会通过一个回调方法将 Confirm
信息回传给生产端。这样,如果生产端收到了这个 Confirm
信息,就知道是该消息已经持久化到磁盘了;否则,那么就说明这条消息可能半路丢失了,此时你就可以重新投递消息到 MQ
去,确保消息不会丢失
1.1.1. 使用 Confirm
确认机制
实现 ConfirmCallback
并重写 confirm
回调方法。消息发送到 Broker
后触发回调,可以确认消息是否成功发送到 Exchange
# 开启 confirms 回调,确认消息是否成功发送到 Exchange
spring.rabbitmq.publisher-confirms=true
@Autowired
private CachingConnectionFactory connectionFactory;
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(converter());
// 消息是否成功发送到 Exchange 交换机
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
if (ack) {
log.info("消息成功发送到Exchange");
String msgId = correlationData.getId();
msgLogService.updateStatus(msgId, Constant.MsgLogStatus.DELIVER_SUCCESS);
} else {
log.info("消息发送到Exchange失败, {}, cause: {}", correlationData, cause);
}
});
return rabbitTemplate;
}
1.2. 确认消息是否从 Exchange
交换机成功路由到 Queue
队列
实现 ReturnCallback
并重写 returnedMessage
回调方法,可以确认消息从 EXchange
路由到 Queue
失败。这里的回调是一个失败回调,只有消息从 Exchange
路由到 Queue
失败才会回调这个方法
# 开启 returnedMessage 回调,确认消息是否从 Exchange 成功发送到 -> Queue
spring.rabbitmq.publisher-returns=true
# 触发returnedMessage回调必须设置mandatory=true, 否则Exchange没有找到Queue就会丢弃掉消息, 而不会触发回调
spring.rabbitmq.template.mandatory=true
@Autowired
private CachingConnectionFactory connectionFactory;
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate<