今天就说一下 如何防止消息丢失 防止消息丢失 分为 消息发送确认和消息消费确认,今天先说消息发送确认
经过我的了解,消息发送确认分为两个步骤,消息到达交换机和消息到达队列,这是两个分开的步骤
直接上代码来介绍,要开启消息发送确认需要在配置上增加这两项
#开启生产者消息确认机制 spring.rabbitmq.publisher-confirms=true spring.rabbitmq.publisher-returns=true
我们需要知道两个接口,
RabbitTemplate.ConfirmCallback
RabbitTemplate.ReturnCallback
第一个接口,对应着消息到达交换机这一步,第二个接口,对应着消息到达队列这一步
@Service public class ConfirmCallBackListener implements RabbitTemplate.ConfirmCallback { @Autowired private RabbitTemplate rabbitTemplate; @PostConstruct public void init(){ rabbitTemplate.setConfirmCallback(this); } @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { System.out.println("消息唯一标识:"+correlationData); System.out.println("确认结果:"+ack); System.out.println("失败原因:"+cause); } }
@Service public class ReturnCallBackListener implements RabbitTemplate.ReturnCallback{ @Autowired private RabbitTemplate rabbitTemplate; @PostConstruct public void init(){ rabbitTemplate.setReturnCallback(this); } @Override public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { System.out.println("return--message:" + new String(message.getBody()) + ",replyCode:" + replyCode + ",replyText:" + replyText + ",exchange:" + exchange + ",routingKey:" + routingKey); } }
就是这么简单,配置完成之后,一旦消息成功到达交换机,confirmCallBack 收到的ack就是true,如果没有到达交换机,收到的ack就是false
如果消息到达了队列,那么returnCallBack不会收到任何消息,如果消息到达不了队列(路由不到队列等),就会触发回调
我在查资料的时候发现,有一篇文章说需设置mandatory=true,否则不会触发returncallback的回调,不太清楚,需要继续查资料