多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 生产者确认 ​ 当消息的生产者将消息发送出去之后,消息到底有没有正确的到达服务器呢?如果不进行特殊配置,默认情况下发送消息这个操作是不会返回任何信息给生产者的,也就是默认情况下生产者不知道消息有没有正确地到达服务器。 RabbitMQ 针对这个问题,提供了两种解决方案: * 通过事务机制实现; * 通过发送方确认机制实现 # 事务机制 ​`RabbitMQ`客户端提供了与事务机制的三个方法:channel.txSelect()、channel.txCommit() 和 channel.txRollback()。`事务机制`跟数据库事务**`不一样`**,这种事务是为了保证消息被`RabbitMQ`接收,如果事务提交成功,那么消息一定被`RabbitMQ`接收。提交之前如果报错,我们便可以将它捕获,进而通过执行 channel.txRollback() 方法来实现当前 channel 事务的回滚 ~~~ try { channel.txSelect(); channel.basicPublish(exchange, routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes()); int result = 1/0; channel.txCommit(); } catch(Exception e) { e.printStackTrace(); channel.txRollback(); } ~~~ **缺点:** 严重降低了`RabbitMQ`的消息吞吐量 # 发送方确认机制 ​`RabbitMQ`的事务机制在性能上得不到保证,所以引入了一种轻量级的方式 —— 发送方确认(publisher confirm)机制。该机制可以弥补`事务机制`的缺陷,提高了整体的吞吐量。使用 SrpingBoot 整合 RabbitMQ,如何实现发送方确认机制呢? 1. **application.yml**文件需要启用`publisher-confirms`、`publisher-returns` 2. 在`RabbitMQ`配置类中,自定义`RabbitTempalte`,设置`setMandatory(true)`,否则消息路由失败不会回调 ReturnCallback;通过调用`setConfirmCallback()`、`setReturnCallback()`传入它们的实现