引言:

自我们安装好rabbitmq之时,系统默认生产者与消费者发布消费机制为自动模式,也就是说无需我们知道是否成功,即发布方法调取之后,消费者无异常后,整个流程完毕,但由于我们业务当中,由于网络波动或服务异常,消息有可能未成功被处理,这就需要我们确保消息真的到达了队列,或真的被消费成功,此文章将为大家讲解如何确定发布者将消息是否到达了交换机或队列

本次我们采用rabbitTemplate方式发送

rabbitmq发布确认有三种方式:

  1. 单独发布消息:同步等待确认,简单,但吞吐量非常有限
  2. 批量发布消息:批量同步等待确认,简单,合理的吞吐量,一旦出现问题但很难推断出是哪条消息出现了问题。
  3. 异步处理:最佳性能和资源利用,在出现错误的情况下可以很好地控制,但是实现起来稍微复杂一些。

一、yml文件添加如下:

# spring
spring:#配置rabbitMq 服务器rabbitmq:host: 127.0.0.1port: 5672username: testpassword: testpublisher-confirm-type: correlated    // 此处为新加

二、代码实现:

  1. 单独发布消息
rabbitTemplate.convertAndSend("exchage", "routingkey", "消息体");
boolean flag = rabbitTemplate.waitForConfirms(1000);
if(flag){System.out.println("收到消息!");
}
 单独发布采用waitForConfirms(1000)方法来同步接收确认结果,如在指定时间内未确认发布成功则抛出异常,如发布消息失败则返回false,成功为true
  1. 批量发布消息
for(int i = 0; i < 10; i++){rabbitTemplate.convertAndSend("exchage", "routingkey", "消息体");
}
if(flag){System.out.println("Broker已经收到消息!");
}
批量发布与单独发布无异,只是发布一批消息后再确定
  1. 异步回调发布消息
// 设置消息回调,一个rabbitTemplate实例只能设置一次
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if (ack) {log.debug("接收消息成功,订单号:{}", correlationData.getId());} else {log.error("接收消息失败,订单号:{},原因:{}", correlationData.getId(), cause);}}
});// 发布消息
CorrelationData correlationData = new CorrelationData(id);
rabbitTemplate.convertAndSend("exchage", "routingkey", "消息体", correlationData);
异步发送即确定是是否被发送到了交换机,成功或失败均会在回调方法显示,大大提高了效率,推荐使用

此次教程就先讲到这里,还有一种回调是ReturnCallback,代表消息是否成功送达到queue,我们下回分解~

Java教程:RabbitMq如何开启发布手动确认模式,采用及时或异步方式确定消息是否发送到队列相关推荐

  1. RabbitMQ手动确认模式(项目开发常用模式)

    RabbitMQ 手动确认模式(日常项目开发常用模式) 借鉴导言 架构及工作原理 项目开发使用(公司常用) 借鉴导言 此文借鉴多名CSDN用户博客,并将其博文中关于MQ常用的点,进行了归纳整理 借鉴博 ...

  2. RabbitMQ之事务以及Confirm确认模式

    spring:rabbitmq:port: 5672host: 127.0.0.1username: guestpassword: guest 事务 事务的实现主要是对信道(Channel)的设置,主 ...

  3. java实现rabbitmq动态路由/话题模型(topic queues), 生产者 消费者 交换机 消息队列

    在routing路由模型中,我们实现了可以根据routingKey来选择性地将消息发送到对应的消息队列中,但是,这种模型不够灵活,比如最开始只有warn.info.error.三种类型的日志,但后面如 ...

  4. RabbitMQ 从入门到精通 消息应答 持久化 交换机 队列 发布确认 集群 等

    RabbitMQ消息队列 RabbitMQ 的概念 RabbitMQ 是一个消息中间件:它接受并转发消息.你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快 ...

  5. rabbitmq 手动提交_第四章----SpringBoot+RabbitMQ发送确认和消费手动确认机制

    1. 配置RabbitMQ # 发送确认 spring.rabbitmq.publisher-confirms=true # 发送回调 spring.rabbitmq.publisher-return ...

  6. rabbitmq手动确认ack

    [README] 参考 https://blog.csdn.net/u012943767/article/details/79300673 : [0]声明交换机,队列 与绑定 /*** 交换机,队列声 ...

  7. Spring Kafka消费模式(single, batch)及确认模式(自动、手动)示例

    目录 1. 单记录消费listener.type=single 1.1 单记录消费 - 自动确认 1.2 单记录消费 - 手动确认 2. 批量消费listener.type=batch 2.1 批量消 ...

  8. 学java教程之面向对象(四)

    学编程吧学java教程之面向对象(四)发布了,欢迎通过xuebiancheng8.com来访问 本次课来分析java面向对象之构造方法.什么是构造方法呢,构造方法听名字顾名思义,构造的时候执行的方法就 ...

  9. activemq - 浅析消息确认模式

    2019独角兽企业重金招聘Python工程师标准>>> 前言 JMS的消息确认模式,定义了客户端(消息发送者或者消费者)与broker确认消息的方式,可以认为是客户端与Broker之 ...

最新文章

  1. 【怎样写代码】对象克隆 -- 原型模式(二):解决方案
  2. 成功解决极其刁钻bug之SyntaxError: invalid character in identifier
  3. C语言求阶乘(附完整源码)
  4. 不带头结点链表,尾部插入法创建
  5. oracle impdp导入实例,Oracle数据泵导入导出案例
  6. (原创)一个和c#中LazyT类似的c++ LazyT类的实现
  7. Linux内核驱动模块示例--Helloword及Makefile
  8. java math rint_Java Math rint() 使用方法及示例
  9. 关于axios中'$router' of undefined问题
  10. springboot 循环引用问题
  11. pythoncharm安装配置_pycharm的安装与配置
  12. OpenCV绘制多边形的代码
  13. 学生网上评教系统php,学生评教系统设计与实现.doc
  14. Atitit 避税之道 如何降低企业与项目组成本 attilax总结
  15. git+vue项目实战
  16. sai笔记1-sai安装
  17. 对圆柱面的曲面积分_圆柱体的对面积的曲面积分
  18. 美化导航html,HTML-美化
  19. OCR中文简体汉字字符材料制作
  20. Linux之用户和权限

热门文章

  1. 深度理解矩阵的奇异值,特征值
  2. 为什么要劝退分子科学与工程?
  3. C语言实现二、十、十六进制的相互转换
  4. G711 G729音频编码总结
  5. frustum pointnets训练代码学习笔记——kitti_object.py
  6. 自动驾驶软件开发人才现状_新技术改变传统出行方式 多国自动驾驶行业现状及人才需求分析...
  7. 计算机在环境设计中的应用前景,浅谈数字媒体艺术的现状与前景
  8. 2021-05-02
  9. Maltego 版本类型重新选择
  10. 计算机网络-MAC地址与以太网帧格式