rabbitmq生产者消息确认
在使用 RabbitMQ 的时候,有时候当我们生产者发送一条消息到 RabbitMQ 服务器后,我们 生产者想知道消息是否到达了 RabbitMQ 服务器上。这个时候我们应该如何处理?
针对上述问题,RabbitMQ 提供了2中解决方案。
- 通过事务机制实现(不推荐)
- 通过发送方确认(publisher confirm)机制实现(推荐)
- 注意:
- 1、上方2中方式不可共存,只能选取一种,如果一个channel上开启事务又开启confirm则会报错。
- 2、如果发送消息的交换器没有匹配的队列,那么消息也会丢失。
通过事务机制实现
RabbitMQ 客户端中与事务机制相关的方法共有三个。
channel.txSelect(): 用于将当前 channel 设置成事务模式
channel.txCommit(): 用于提交事务 (事务提交成功,说明消息一定到达了RabbitMQ服务器中)
channel.txRollback():用于回滚事务
java 生产者 事务 实现的代码如下:
注意:事务机制到发送一条消息之后会使发送端阻塞,在RabbitMQ服务端回应之后,才能继续发送下一条消息,在高并发的情况下可能性能不怎么好,因此不建议使用。
发送方确认机制(Comfirm Listener)
消息的确认机制有好几种,此处介绍效率最高的异步确认机制。
异步确认机制:
1、使用 channel.confirmSelect() 将channel设置成 confirm 模式
2、使用 channel.addConfirmListener 监控消息是否到达RabbitmqMQ
监听器中的 deliverTag 和multiple 参数见下方图中解释。
生产者将channel设置成confirm 模式后,在此channel上发布的消息都会被分派一个唯一的ID(从1开始),当消息不exchange路由到所匹配的队列后,如果消息是持久化的,那么在消息持久化后,RabbitMQ 就会发送一个确认(Basic.Ack)给生产者(包含消息的唯一ID),这样生产者就知道消息正确到达RabbitMQ了。
java 生产者 异步确认 实现的代码如下:
完整代码:
本文来自博客园,作者:huan1993,转载请注明原文链接:https://www.cnblogs.com/huan1993/p/15416057.html