從源碼層級深入探索 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.pswp.cn/web/63098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63098.shtml
英文地址,請注明出處:http://en.pswp.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;還要不忘時時觀照己身。自省自悟之…