前言
上一章讲解了RabbitMq的三种Exchange消息发送的模式,但是在默认情况下RabbitMQ并不能保证消息是否发送成功,以及是否能被成功消费,为了保证消息在传递过程中不丢失,需要对消息进行确认机制,来提高消息的可靠性。
消息确认
基本流程
说明:
- 生产者发送消息到RabbitMQ Server后,RabbitMQ Server需要对生产者进行消息Confirm确认。
- 消费者消费消息后需要对 RabbitMQ Server进行消息ACK确认。
消息确认模式
RabbitMq提供了两种消息发送者确认模式分别为: ConfirmCallback确认模式和 ReturnCallback退回模式。
ConfirmCallback确认模式
@Component
public class RabbitConfirmConfig implements ConfirmCallback
{
private Logger logger = LoggerFactory.getLogger(RabbitConfirmConfig.class);
public void confirm(CorrelationData correlationData, boolean ack,
String cause)
{
logger.info("数据内容:{}",correlationData);
logger.info("是否确认成功:{}",ack);
logger.info("错误原因:{}",cause);
if (!ack)
{
logger.info("exchange produce confirm message send error" + cause);
}
else
{
logger.info("exchange produce confirm message send success");
}
}
}
说明:ConfirmCallback模式确认,需要重写confirm接方法,此方法的三个参数分别为:CorrelationData、ack、cause
- CorrelationData:对象内部只有一个id属性,用来表示当前消息的唯一性。
- ack:消息投递状态,true表示投递成功
- cause: 消息投递失败原因
虽然消息被broker接收到只能表示已经到达MQ服务器,但是并不能保证消息一定会被投递到目标 queue里。所以我们需要实现returnCallback来进行相关处理。
ReturnCallback退回模式
@Component
public class RabbitReturnConfig implements ReturnCallback
{
private Logger logger = LoggerFactory.getLogger(RabbitReturnConfig.class);
public void returnedMessage(Message message, int replyCode,
String replyText, String exchange, String