消息的可靠性投递——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】消息的可靠性投递与签收相关推荐

  1. Rabbitmq专题:rabbitMQ如何保证消息的可靠性投递?如何防止消息丢失

    文章目录 1. 消息可能出现丢失的情况 2. 生产者如何保证消息的可靠性投递 2.1 消息落库打标 + confirm机制 2.2 消息幂等性如何保证? 2.3 延时消息确认 3. rabbitMQ服 ...

  2. RabbitMQ消息中间件(二) RabbitMQ如何保证消息的可靠性投递

    RabbitMQ如何保证消息投递的准确性? 生产端的可靠性投递: 1.保证消息成功发送 2.保证MQ节点成功接收 3.发送端收到MQ节点(Broker)确认应答 4.完善的消息补偿机制 BAT等大厂解 ...

  3. 四种策略确保 RabbitMQ 消息发送可靠性!你用哪种?

    微服务可以设计成消息驱动的微服务,响应式系统也可以基于消息中间件来做,从这个角度来说,在互联网应用开发中,消息中间件真的是太重要了. 今天,以 RabbitMQ 为例,松哥来和大家聊一聊消息中间消息发 ...

  4. php定时发送生日模块消息_RabbitMQ之消息的可靠性投递

    生产端的可靠性投递: 1.保障消息成功发送出去 2.保障mq节点成功接收消息 3.消息发送端需要收到mq服务的确认应答 4.完善的消息补偿机制(百分百成功成功,需要该步骤) 消息落库方案 订单服务调用 ...

  5. 保证RabbitMQ消息的可靠性总结

    文章目录 一.关于消息的可靠性 二.生产者发送消息对象 三.将消息发送给交换机 四.将消息发送给队列 五.将消息发送给消费者 六.保证消息的幂等性 七.死信消息的补偿[存在问题,待完善] 一.关于消息 ...

  6. 11 RabbitMQ消息的可靠性保障

    RabbitMQ消息的补偿机制--确保消息百分百发送成功 首先producer操作自己的数据库,发送一条消息,将这个消息存储在Q1这个队列中. 然后Consumer拿Q1中的消息去消费,同时操作自己的 ...

  7. RabbitMQ,Springboot整合RabbitMQ实现 消息可靠性投递,Consumer ACK,TTL,死信队列,使用TTL+死信队列=延迟队列

    搭建SpringBoot项目,用于演示 springboot版本 <!-- spring boot --><dependency><groupId>org.spri ...

  8. 【消息队列之rabbitmq】Rabbitmq之消息可靠性投递和ACK机制实战

    目录 一.绪论 二.生产者 2.1事务机制 2.2confirm模式 串行模式 批量模式 异步模式 三.消费者 3.1手动ACK 一.绪论 上篇文章介绍了rabbitmq的基本知识.交换机类型实战&l ...

  9. Rabbitmq消息可靠投递和重复消费等问题解决方案

    消息的可靠性投递 在一些对数据一致性要求较高的业务场景里面,如果消息在发布和消费过程中出现了问题(消息丢失,消息重复消费),就会导致数据不一致,要做到消息的可靠性投递. 在RabbitMq里面提供了很 ...

最新文章

  1. 如何把 XML 文件显示为 HTML 表格
  2. R语言单变量分析实战:汇总统计(Summary Statistics)、频率表(Frequency Table)、图表(charts: boxplot、histogram、density)
  3. 使用第三方库(Senparc)完成小程序支付 - z
  4. PostgreSQL(从版本9.3至11.2)任意命令执行漏洞 cve-2019-9193
  5. redis批量操作及性能分析
  6. ik mysql热加载分词_Elasticsearch 之(25)重写IK分词器源码来基于mysql热更新词库...
  7. Flv网络播放器制作全攻略
  8. 关于《设计模式演练》系列文章结构的规范
  9. matlab球心投影,球心投影
  10. php orm教程,Laravel ORM 数据model操作教程
  11. 计蒜客——双重回文数
  12. javascript return
  13. python零基础自学教材-Python3零基础教材电子书合集
  14. CSR8615蓝牙芯片功能调试入门笔记---上
  15. mysql开发技巧笔记
  16. GitHub开源推荐 | qsint-基于Qt的UI控件
  17. matlab 双馈,基于Matlab的双馈调速系统研究
  18. “../28004x_generic_ram_lnk.cmd“,遇到RAM内存不够,需重新配置。
  19. oracle创建bigfile表空间,表空间管理之bigfile表空间设置
  20. php手机网页_如何制作手机网页?

热门文章

  1. Java 中String构造方法
  2. CSS3 字体【@font-size使用全攻略-配合font squirrel】
  3. 3D沙盘地图的拖动与缩放
  4. Java视频教学从入门到精通(2022最新版)
  5. java基于Android校园购物商城小超市
  6. Libnet开发流程总结
  7. ARCGIS定义CGCS_2000坐标系下的高斯投影
  8. 创意电子学-第03课:初学者如何使用数字万用表
  9. fastadmin使用editable实现行内编辑无刷新效果
  10. LPDDR4 新技术改进特性介绍