从源码层级深入探索 Spring AMQP 如何在 Spring Boot 中实现 RabbitMQ 集成——消费者如何进行消费

  本章节主要从底层源码探索Spring Boot中RabbitMQ如何进行消费,至于RabbitMQ是如何使用如何生产消息,本章不做过多介绍,感兴趣的小伙伴可以参考:从源码层级深入探索 Spring AMQP 如何在 Spring Boot 中实现 RabbitMQ 集成——生产者如何将消息发送到 RabbitMQ Exchange-CSDN博客文章浏览阅读14次。RabbitAutoConfiguration,RabbitAdmin,RabbitTemplate,declareExchanges,convertAndSendhttps://blog.csdn.net/qq_26733517/article/details/144511012?spm=1001.2014.3001.5501

1.Spring Boot中RabbitMQ如何消费

  Spring Boot中RabbitMQ的消费使用非常简单,一般使用@RabbitListener或者@RabbitListener+@RabbitHandler,前者使用在方法上, 一个消费者只有一个方法,消息来了就是目标方法执行,不管参数类型跟消息类型是否匹配。后者使用在类上,一个消费者包含多个候选处理方法,根据消息的类型进行选择执行。具体使用如下图:

  那么为什么使用一个简单的注解@RabbitListener就可以实现消费呢,它的底层是如何运转实现的呢?

2.@RabbitListener注解底层如何实现消费的

  其是这还是离不开Spring Boot自动装配引入的RabbitAutoConfiguration配置类,再该类中帮我们引入了一系列配置类,如下:RabbitAutoConfiguration->RabbitAnnotationDrivenConfiguration->EnableRabbitConfiguration(该配置类中某个bean对象存在@EnableRabbit注解)->
RabbitListenerConfigurationSelector(@EnableRabbit注解引入)->RabbitBootstrapConfiguration->
RabbitListenerAnnotationBeanPostProcessor、RabbitListenerEndpointRegistry。消费实现的核心就是这两个配置类,接下来我们进行逐一研究。

1.RabbitListenerAnnotationBeanPostProcessor

  该配置类实现了BeanPostProcessor+SmartInitializingSingleton接口,再所有的bean对象初始化前后均会调用BeanPostProcessor接口的前置、后置方法。再所有的bean对象初始化完成后(所有的bean对象已经生成)会调用SmartInitializingSingleton接口的afterSingletonsInstantiated方法。其主要作用是用来解析@RabbitListener,具体如下:

  接着分别看一下processAmqpListener和processMultiMethodListeners两个方法,如下图:

  从上面两个图中可以看出,二者底层均是调用了processListener方法,该方法具体如下:

  接着看一下registerEndpoint方法,如下:

  至此整个BeanPostProcessor接口的后置方法就已经完成,其作用就是将解析的@RabbitListener注解的信息封装成一个个AmqpListenerEndpointDescriptor里面封装了AbstractRabbitListenerEndpoint,然后放入到了RabbitListenerEndpointRegistrar.endpointDescriptors属性集合中。

执行完BeanPostProcessor接口后,等ioc容器的所有bean对象初始化完成后会继续调用该方法的afterSingletonsInstantiated方法,具体如下:

  接着看一下this.registrar.afterPropertiesSet()方法,具体如下:

  接着看一下registerListenerContainer方法,具体如下:

  至此SmartInitializingSingleton接口的方法afterSingletonsInstantiated,将每一个@RabbitListener注解的信息封装成了SimpleMessageListenerContainer,然后封装到了RabbitListenerEndpointRegistry中的listenerContainers属性集合中,该类是不是有点眼熟,就是我们开始时说的两个核心类之一,接下来我们便研究一下它。

2.RabbitListenerEndpointRegistry

  RabbitListenerEndpointRegistry实现了lifecyle接口,再spring容器刷新的最后一步会调用该类的start方法,处理上面解析的@RabbitListener注解信息,具体如下:

  接着看一下startIfNecessary方法,调用每一个MessageListenerContainer(SimpleMessageListenerContainer)的start方法,如下:

  调用的为AbstractMessageListenerContainer(父类)中的start方法,如下:

  紧接着看一下SimpleMessageListenerContainer中的doStart()方法,如下:

  接着看一下AsyncMessageProcessingConsumer的run() ,如下:

  初始化的过程此处就不再介绍了,主要看一下事件如何处理的,即mainLoop方法,具体如下:

  receiveAndExecute方法底层调用了doReceiveAndExecute方法,具体如下:

  目标方法的执行涉及的东西比较多,包括处理在@RabbitListener注解中使用errorHandler和returnExceptions等属性,比较复杂,本篇暂不做过多介绍。我们看一下Spring Boot的假的‘自动确认’吧,即commitIfNecessary方法,如下:

  所以说Spring Boot提供所谓自动确认并不是真正的自动确认,只是Spring Boot再执行完目标方法后帮我们进行了确认,所以对开发者来说感知上是自动确认。

  如果您希望更深入地学习SpringBoot源码,我强烈推荐您访问以下项目链接:https://gitee.com/chengyadong555/spring-boot.git。在这个项目中,您将发现对SpringBoot源码的逐行分析,作者不仅提供了丰富的注释,还融入了自己独到的理解和见解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/63098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉中的边缘检测算法

摘要: 本文全面深入地探讨了计算机视觉中的边缘检测算法。首先阐述了边缘检测的重要性及其在计算机视觉领域的基础地位,随后详细介绍了经典的边缘检测算法,包括基于梯度的 Sobel 算子算法、Canny 边缘检测算法等,深入剖析了它们的…

Unix 和 Windows 的有趣比较

Unix 和 Windows NT 比较 来源于这两本书,把两本书对照来读,发现很多有意思的地方: 《Unix 传奇》 https://book.douban.com/subject/35292726/ 《观止 微软创建NT和未来的夺命狂奔 》 Showstopper!: The Breakneck Race to Create Windows…

SSM 垃圾分类系统——高效分类的科技保障

第五章 系统功能实现 5.1管理员登录 管理员登录,通过填写用户名、密码、角色等信息,输入完成后选择登录即可进入垃圾分类系统,如图5-1所示。 图5-1管理员登录界面图 5.2管理员功能实现 5.2.1 用户管理 管理员对用户管理进行填写账号、姓名、…

系列1:基于Centos-8.6部署Kubernetes (1.24-1.30)

每日禅语 “木末芙蓉花,山中发红萼,涧户寂无人,纷纷开自落。​”这是王维的一首诗,名叫《辛夷坞》​。这首诗写的是在辛夷坞这个幽深的山谷里,辛夷花自开自落,平淡得很,既没有生的喜悦&#xff…

Y20030004基于asp.net+Sql的环保网站的设计与实现(附源码 调试 文档)

环保网站的设计与实现 1.摘要要2. 系统功能3.功能结构图4.界面展示5.源码获取 1.摘要要 近几年国家对于环境管理是高度重视,尤其是对于环境生态的破坏与环境污染,已经严重影响到人类的生存和发展。为了使生态环境能够得到保护和改善,持续发展…

安全计算环境-(一)路由器-1

安全计算环境-网络设备 安全管理中心针对整个系统提出了安全管理方面的技术控制要求,通过技术手段实现集中管理;涉及的安全控制点包括系统管理、审计管理、安全管理和集中管控。以下以三级等级保护对象为例,描述安全管理中心各个控制要求项的…

D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。

概述: D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。 主要特点: ● 高精度基准电路 ● 定时闩锁、短路保护电路 ● 低电压输入时误操作保护电路 ● 输出基准电压(2.5V) ● 超过工作范围能进行自动校…

数据挖掘之聚类分析

聚类分析(Clustering Analysis) 是数据挖掘中的一项重要技术,旨在根据对象间的相似性或差异性,将对象分为若干组(簇)。同一簇内的对象相似性较高,而不同簇间的对象差异性较大。聚类分析广泛应用…

Qt 图形框架下图形拖动后位置跳动问题

在使用Qt 的图形框架QGraphicsScene,QGraphicsView实现图形显示时。遇到一个很棘手的BUG。 使用的图形是自定义的QGraphicsObject的子类。 现象是将图形添加到画布上之后,用鼠标拖动图形,图形能正常改变位置,当再次用鼠标点击图…

Vue技术中参数传递:Props与事件的实践指南

在Vue.js中,组件间的参数传递是构建动态和交互式应用的核心。本文将深入探讨如何通过Props和事件($emit)在Vue组件间进行参数传递,并提供代码示例。 Props传递数据 Props是Vue中组件间传递数据的一种方式,它允许父组…

一、LRU缓存

LRU缓存 1.LRU缓存介绍2.LRU缓存实现3.LRU缓存总结3.1 LRU 缓存的应用3.2 LRU 缓存的优缺点 1.LRU缓存介绍 LRU是Least Recently Used 的缩写,意为“最近最少使用”。它是一种常见的缓存淘汰策略,用于在缓存容量有限时,决定哪些数据需要被删…

LabVIEW光栅衍射虚拟仿真系统

随着现代教育技术的快速发展,虚拟仿真实验平台逐渐成为物理实验教学的重要辅助工具。基于LabVIEW的平面透射光栅虚拟仿真系统帮助学生更好地理解和分析光栅衍射现象,提高教学质量和学生的学习兴趣。 项目背景 在波动光学的教学中,光栅衍射实…

241211 selenium问题记录

The process started from chrome location /usr/bin/chromedriver is no longer running, so ChromeDriver is assuming that Chrome has crashed. 声明option类 chrome_option.add_argument(--headless) 后台启动webdriver NoSuchDriverException(msg) from err selenium.c…

前端核心知识总结

‌前端架构知识总结‌主要包括以下几个方面&#xff1a; ‌HTML‌&#xff1a;HTML是构建网页的基础&#xff0c;使用各种标签定义网页的结构&#xff0c;如<html>、<head>、<body>等。HTML5引入了新的语义化标签&#xff0c;如<article>、<section…

libcublas.so.11: cannot open shared object file: no such file or di

问题&#xff1a;在linux系统安装tensorrt后import tensorrt时出现 libcublas.so.11: cannot open shared object file: no such file or directory 或者 libcublasLt.so.11&#xff1a;cannot open shared object file: no such file or directory 或者 libcudnn.so.8&…

Linux编译Kernel时的文件zImage、文件dtb(dtbs)、核心模块分别是什么东西?

zImage文件的介绍 在编译Linux内核时&#xff0c;zImage 是一种内核映像文件&#xff0c;它是内核的压缩版本&#xff0c;通常用于引导嵌入式设备或其他资源有限的环境。 zImage 的具体含义 zImage 是 “Compressed Kernel Image” 的缩写。它是通过压缩原始的内核映像&…

Spring Boot 3.x嵌入MongoDB 进行测试

在现代应用开发中&#xff0c;数据库是不可或缺的一部分。对于使用 MongoDB 的 Java 应用&#xff0c;进行单元测试时&#xff0c;通常需要一个轻量级的数据库实例。de.flapdoodle.embed.mongo 是一个非常有用的库&#xff0c;它允许开发者在测试中嵌入 MongoDB 实例&#xff0…

scala隐式类

1 定义 隐式类指的是用implicit关键字修饰的类。在对应的作用域内&#xff0c;带有这个关键字的类的主构造函数可用于隐式转换。 2示例 现在有一个需求&#xff1a;有一个 Person 类&#xff0c;含有work&#xff08;&#xff09;方法&#xff0c;有一个 Student 类&#xff0…

Swin Transformer:用Transformer实现CNN多尺度操作

文本是关于Swin Transformer基础知识的了解 论文&#xff1a;https://arxiv.org/pdf/2103.14030 项目&#xff1a;https://github. com/microsoft/Swin-Transformer. 实现一个Swin Transformer&#xff1a;Swin Transformer模型具体代码实现-CSDN博客 Swin Transformer mlp…

系列2:基于Centos-8.6Kubernetes 集成GPU资源信息

每日禅语 自省&#xff0c;就是自我反省、自我检查&#xff0c;自知己短&#xff0c;从而弥补短处、纠正过失。佛陀强调自觉觉他&#xff0c;强调以达到觉行圆满为修行的最高境界。要改正错误&#xff0c;除了虚心接受他人意见之外&#xff0c;还要不忘时时观照己身。自省自悟之…