【RabbitMQ】消息的可靠性投递与签收
消息的可靠性投递——Porducer Confirm
确认模式
发生在从Producer发送到Exchange时,发送成功/失败都会自动调用ConfirmCallBack回调方法。
步骤:
(1)开启确认模式(在connectionFactory中设置publisher-confirms=“true”)
(2)编写ConfirmCallBack回调方法(rabbitTemplate模板上设置并编写回调方法)
回退模式
发生在从Exchange路由到Queue时,路由失败才会自动调用ReturnCallBack回调方法。
步骤:
(1)开启回退模式(在connectionFactory中设置publisher-returns=“true”)
(2)编写ReturnCallBack回调方法(rabbitTemplate模板上设置并编写回调方法)
(3)设置失败后的处理方式(false表示丢弃消息,true表示将消息返还给发送方)
代码
别忘了在connectionFactory中设置publisher-cofirms="true"或publisher-returns="true"
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:producer.xml")
public class ProducerTest {@Autowiredprivate RabbitTemplate rabbitTemplate;/***【确认模式】* 1.开启确认模式(在connectionFactory中设置publisher-confirms="true")* 2.编写ConfirmCallBack回调方法(rabbitTemplate模板上设置并编写回调方法)*/@Testpublic void testConfirm() {// 设置confirm回调rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {public void confirm(CorrelationData correlationData, boolean ack, String cause) {System.out.println("confirm回调被执行了");if (ack) {System.out.println("接收成功!!!");} else {System.out.println("接收失败!!!");System.out.println("失败的原因是:" + cause);}}});// 发送消息rabbitTemplate.convertAndSend("test_exchange", "routing_key", "我是一个消息~");}/***【回退模式】* 1.开启回退模式(在connectionFactory中设置publisher-returns="true")* 2.编写ReturnCallBack回调方法(rabbitTemplate模板上设置并编写回调方法)* 3.设置失败后的处理方式:* - 设置为false:丢弃消息(默认)* - 设置为true:返回消息给发送方*/@Testpublic void testReturn() {// 设置return回调rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {System.out.println("return回调被执行了");System.out.println("返回来的消息是:" + message);}});// 设置失败处理方式rabbitTemplate.setMandatory(true);// 发送消息rabbitTemplate.convertAndSend("test_exchange", "routing_key", "我是一个消息~");}}
消息的可靠性签收——Consumer Ack
ack即acknowledge确认属性,它可以在rabbit:listener-container标签中设置。
ack的值有3种:
(1)none:自动确认(自动签收)
(2)manual:手动确认(手动签收)
(3)auto:根据异常情况确认,比较麻烦
自动签收
消息一旦被Consumer接收到,则自动确认,并将该message从消息队列中移除。
这样做的缺点时显而易见的,当在业务处理时出错,你想要再次取出该meassge重新处理时,它已经不见了。
手动签收
消息被Consumer拿到后,不会立即从消息队列中移除,而是等待业务逻辑处理完毕并成功后,再由我们手动将其确认并移除。
代码
因为自动签收(channel.basicAck)和手动签收(channel.basicNack)都需要由管道对象(channel)调用
而MessageListener接口的抽象方法的参数中只有message而没有channel,所以这里要使用它的子接口ChannelAwareMessageListener
/*** 1.设置手动签收。在rabbit:listener-container中设置acknowledge="manual"* 2.编写一个实现ChannelAwareMessageListener接口的监听器* 3.如果消息成功处理,则调用channel的basicAck()方法手动签收* 4.如果消息成功失败,则调用channel的basicNack()方法拒绝签收,消息重回队列并再次重发*/@Component
public class AckListener implements ChannelAwareMessageListener {@Overridepublic void onMessage(Message message, Channel channel) throws Exception {// 转换并打印消息System.out.println(new String(message.getBody()));// 获取签收标签long deliveryTag = message.getMessageProperties().getDeliveryTag();try {System.out.println("处理业务逻辑...");channel.basicAck(deliveryTag, true); // 手动签收} catch (Exception e) {channel.basicNack(deliveryTag ,true, true); // 拒绝签收}}@Overridepublic void onMessage(Message message) {}
}
【RabbitMQ】消息的可靠性投递与签收相关推荐
- Rabbitmq专题:rabbitMQ如何保证消息的可靠性投递?如何防止消息丢失
文章目录 1. 消息可能出现丢失的情况 2. 生产者如何保证消息的可靠性投递 2.1 消息落库打标 + confirm机制 2.2 消息幂等性如何保证? 2.3 延时消息确认 3. rabbitMQ服 ...
- RabbitMQ消息中间件(二) RabbitMQ如何保证消息的可靠性投递
RabbitMQ如何保证消息投递的准确性? 生产端的可靠性投递: 1.保证消息成功发送 2.保证MQ节点成功接收 3.发送端收到MQ节点(Broker)确认应答 4.完善的消息补偿机制 BAT等大厂解 ...
- 四种策略确保 RabbitMQ 消息发送可靠性!你用哪种?
微服务可以设计成消息驱动的微服务,响应式系统也可以基于消息中间件来做,从这个角度来说,在互联网应用开发中,消息中间件真的是太重要了. 今天,以 RabbitMQ 为例,松哥来和大家聊一聊消息中间消息发 ...
- php定时发送生日模块消息_RabbitMQ之消息的可靠性投递
生产端的可靠性投递: 1.保障消息成功发送出去 2.保障mq节点成功接收消息 3.消息发送端需要收到mq服务的确认应答 4.完善的消息补偿机制(百分百成功成功,需要该步骤) 消息落库方案 订单服务调用 ...
- 保证RabbitMQ消息的可靠性总结
文章目录 一.关于消息的可靠性 二.生产者发送消息对象 三.将消息发送给交换机 四.将消息发送给队列 五.将消息发送给消费者 六.保证消息的幂等性 七.死信消息的补偿[存在问题,待完善] 一.关于消息 ...
- 11 RabbitMQ消息的可靠性保障
RabbitMQ消息的补偿机制--确保消息百分百发送成功 首先producer操作自己的数据库,发送一条消息,将这个消息存储在Q1这个队列中. 然后Consumer拿Q1中的消息去消费,同时操作自己的 ...
- RabbitMQ,Springboot整合RabbitMQ实现 消息可靠性投递,Consumer ACK,TTL,死信队列,使用TTL+死信队列=延迟队列
搭建SpringBoot项目,用于演示 springboot版本 <!-- spring boot --><dependency><groupId>org.spri ...
- 【消息队列之rabbitmq】Rabbitmq之消息可靠性投递和ACK机制实战
目录 一.绪论 二.生产者 2.1事务机制 2.2confirm模式 串行模式 批量模式 异步模式 三.消费者 3.1手动ACK 一.绪论 上篇文章介绍了rabbitmq的基本知识.交换机类型实战&l ...
- Rabbitmq消息可靠投递和重复消费等问题解决方案
消息的可靠性投递 在一些对数据一致性要求较高的业务场景里面,如果消息在发布和消费过程中出现了问题(消息丢失,消息重复消费),就会导致数据不一致,要做到消息的可靠性投递. 在RabbitMq里面提供了很 ...
最新文章
- 如何把 XML 文件显示为 HTML 表格
- R语言单变量分析实战:汇总统计(Summary Statistics)、频率表(Frequency Table)、图表(charts: boxplot、histogram、density)
- 使用第三方库(Senparc)完成小程序支付 - z
- PostgreSQL(从版本9.3至11.2)任意命令执行漏洞 cve-2019-9193
- redis批量操作及性能分析
- ik mysql热加载分词_Elasticsearch 之(25)重写IK分词器源码来基于mysql热更新词库...
- Flv网络播放器制作全攻略
- 关于《设计模式演练》系列文章结构的规范
- matlab球心投影,球心投影
- php orm教程,Laravel ORM 数据model操作教程
- 计蒜客——双重回文数
- javascript return
- python零基础自学教材-Python3零基础教材电子书合集
- CSR8615蓝牙芯片功能调试入门笔记---上
- mysql开发技巧笔记
- GitHub开源推荐 | qsint-基于Qt的UI控件
- matlab 双馈,基于Matlab的双馈调速系统研究
- “../28004x_generic_ram_lnk.cmd“,遇到RAM内存不够,需重新配置。
- oracle创建bigfile表空间,表空间管理之bigfile表空间设置
- php手机网页_如何制作手机网页?