消息发送到被消费的流程:
JAVA的生产端的发送数据----->Broker(消息服务器)-------->达到Exchange交换机------------->通过路由键到达Queue<------JAVA消费端监听并消费
这里P->B、E->Q属于生产端确认,Q->C是属于消费端确认,

生产端消息确认机制

1.yml配置

  rabbitmq:host: xxxxxxxxvirtual-host: /port: xxx#开启发送端确认p->bpublisher-confirms: true#开启消息抵达队列的确认 e->qpublisher-returns: true#只要消息到达队列,以异步的方式优先回调我们这个returnconfirmtemplate:mandatory: true

2.生产端消息确认机制自定义配置代码
下面这些配置代码属于回调!

/*** @description: Rabbit核心配置* @author TAO* @date 2020/8/4 20:48*/
@Configuration
public class MyRabbitConfig {//讲对象序列化为JSON@Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}@AutowiredRabbitTemplate rabbitTemplate;//定制RabbitTemplate@PostConstruct//MyRabbitConfig对象创建完成后执行这个初始化方法public void initRabbitTemplate(){//设置发送消息确认回调p->brabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback(){/*** @param correlationData  当前消息的唯一关联数据  ,这个是消息的唯一id* @param ack 消息是否成功收到* @param cause 失败原因*/@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {System.out.println("confirm...correlationData=>"+correlationData+"----------ack==>"+ack+"--------cause  ==>"+cause);}});//设置消息抵达队列的失败回调rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {/*** 只要消息没有投递给指定的队列,就会触发这个失败回调* @param message   投递失败的消息* @param replyCode  回复的状态码* @param replyText  回复的文本内容* @param exchange  消息发送的交换机* @param routingKey  消息走的路由键*/@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {System.out.println("returnedMessage-->"+message+"\nreplyCode-->"+replyCode+"\nexchange-->"+exchange+"\nroutingKey-->"+routingKey);}});}
}

3.编写发送消息请求
方便测试

@RestController
public class SendMQController {@AutowiredRabbitTemplate rabbitTemplate;@GetMapping("/send")public String send(){//new CorrelationData(UUID.randomUUID().toString())指定消息的唯一id//项目实际情况还会将消息的唯一id存入数据库中,用作后期队列中的消息消费情况做对比String id=UUID.randomUUID().toString();System.out.println("消息发送中...消息唯一id"+id);rabbitTemplate.convertAndSend("hello-java-exchange", "hello.jasva", "我是一条消息",new CorrelationData(id));return "ok";}
}

4.查看效果

消费端确认机制

消费端是默认自动确认的,只要消息接收到,客户端就会自动确认消息,RabbitMQ就会移除这个消息

1.编写yml配置文件

  rabbitmq:host: xxxvirtual-host: /port: xx#开启发送端确认p->bpublisher-confirms: true#开启消息抵达队列的确认 e->qpublisher-returns: true#只要消息到达队列,以异步的方式优先回调我们这个returnconfirmtemplate:mandatory: true#手动签收消息listener:simple:acknowledge-mode: manual

消息监听处代码编写

@Service
@RabbitListener(queues={"hello-java-queue"})//标注这个类可以监听这个队列中的所有消息
public class RabbitImpl {//我们收到很多消息,自动回复给服务器ack,只有一个消息处理了,然后服务器宕机了,发生消息丢失//这时我们就需要手动确认模式@RabbitHandlerpublic void recieveMessage(Message message, Channel channel){long deliveryTag=message.getMessageProperties().getDeliveryTag();try {//deliveryTag签收的消息标签//multiple 是否批量签收channel.basicAck(deliveryTag,false);//签收//deliveryTag签收的消息标签//multiple 是否批量签收//是否从新入队  (将这条拒收的消息又重新存放带队列中)channel.basicNack(deliveryTag,false,false);//拒收-支持批量//deliveryTag签收的消息标签//multiple 是否批量签收channel.basicReject(deliveryTag,false);//拒收-不支持批量} catch (IOException e) {e.printStackTrace();}System.out.println("接收到消息=>"+message);}
}

消费者获取到消息,成功处理,可 回复Ack给Broker
-basic.ack用于肯定确认;broker将移除此消息
-basic.nack用于否定确认;可以指定broker是否丢弃此消息,可以批量
-basic.reject用于否定确认;同上,但不能批量
默认自动ack,消息被消费者收到,就会从broker的queue中移除"queue无消费者,消息依然会被存储,直到消费者消费,消费者收到消息,默认会自动ack,但是如果无法确定此消息是否被处理完成,或者成功处理。我们可以开启手动ack模式
-消息处理成功, ack(),接受下一个消息,此消息broker就会移除
-消息处理失败, nack()/reject(),重新发送给其他人进行处理,或者容错处理后ack
-消息一直没有调用ack/nack方法, broker认为此消息正在被处理,不会投递给别人,此时客户端断开,消息不会被broker移除,会投递给别人

RabbitMQ消息确认机制-可靠抵达相关推荐

  1. RabbitMQ消息确认机制

    文章目录 1. 事务机制 2. Confirm模式 2.1 生产者 2.1.1 普通Confirm模式 2.1.2 批量Confirm模式 2.1.3 异步Confirm模式 2.2 消费者 3. 其 ...

  2. RabbitMQ消息确认机制和消息重发机制

    一.机制 首先我们要知道一条消息的传递过程. 生产者 -> 交换机 ->  队列 我们的生产者生产消息,生产完成的消息发送到交换机,由交换机去把这个消息转发到对应的队列上.这其中我们可能在 ...

  3. rabbitmq消息确认机制及死信队列的使用

    关于rabbitmq的基本概念和相关的理论这里就不做过多介绍了,在之前的篇幅中有过相应的介绍,也可以查询一些资料详细了解一下rabbitmq的基础知识,下面要介绍的点主要包括两个方面, 1.rabbi ...

  4. RabbitMQ消息确认机制-07

    在 Rabbitmq 中我们可以通过持久化来解决因为服务器异常而导致丢失的问题, 除此之外我们还会遇到一个问题:生产者将消息发送出去之后,消息到底有没有正确到达 Rabbit 服务器呢?如果不做出处理 ...

  5. RabbitMQ 消息确认机制 以及 原理解析

    https://www.cnblogs.com/DBGzxx/p/10091070.html

  6. RabbitMQ 消息确认机制confirm代码编写

  7. springboot + rabbitmq 用了消息确认机制,感觉掉坑里了

    最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI.不过,话说回来这的确是件好事,与其开那些没味的扯皮会,多做技术交流还是很有助于个人 ...

  8. RabbitMQ 基本消息模型和消息确认机制

    ​01 前言 关于 RabbitMQ 服务器的安装,本章节不做介绍,请培养个人动手能力,自行百度解决.RabbitMQ 成功安装后(win 版),浏览器输入:localhost:15672,则可以进入 ...

  9. RabbitMQ ACK消息确认机制 快速入门

    RabbitMQ 消息确认机制ACK ack机制保证的是broker和消费者之间的可靠性 ack表示的是消费端收到消息后的确认方式,有三种确认方式 自动确认:acknowledge="non ...

最新文章

  1. SPSS聚类分析:K均值聚类分析
  2. 比特币的挑战者 BCH 带着开发者们来到湾区了!
  3. 在Spring MVC中使用Apache Shiro安全框架
  4. java get方法不序列化_java常用序列化与反序列化方法
  5. SAP JAM活跃度统计
  6. SUSE中LVM的使用心得
  7. linux常用关机命令及其区别-Shutdown halt reboot init
  8. System memory,AGP memory和video memory
  9. 跨越全场景统一架构三大挑战,MindSpore亮出“四招”
  10. 【Java】开源工具 Hutool 不糊涂
  11. 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(3)
  12. 初识 NGINX 服务网格
  13. 数据分布_数据蒋堂 | 数据分布背后的逻辑
  14. 如何去除数据表中的重复数据
  15. java中对象的克隆
  16. Windows常用快捷键
  17. java mqtt服务器搭建
  18. 基于RK3399Pro的BH1750驱动开发
  19. 南邮计算机学院复试,过来人建议:南京邮电大学考研复试注意事项
  20. TortoiseGit配置SSH key

热门文章

  1. 冲激函数与卷积的多次邂逅
  2. 了不起的 Webpack HMR 学习指南(含源码分析)
  3. CaysnPrinter开发包接口说明文档及打印示例程序 - 20160715
  4. mysql 5.7.24-winx64_mysql-5.7.24-winx64下载与安装
  5. 5G爆发前夜,谷歌微软争相豪赌的云游戏厉害在哪?
  6. SZ19网安密码学期末考试(回忆版)
  7. Win10添加右键打开cmd和Powershell窗口(管理员/非管理员)
  8. Taro React组件使用(1) —— Overlay 遮罩层【渐入渐出动画遮罩层】
  9. C++ GUI Programming with Qt4 Second Edition 之 附录A.2 Windows系统Qt的安装
  10. cuDNN免官网创建账户登陆迅雷下载网址