最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot管理RabbitMQ中的Channel詳解

 更新時間:2023年08月29日 08:44:50   作者:Abstracted  
這篇文章主要介紹了SpringBoot管理RabbitMQ中的Channel詳解,channel僅存在于connection的上下文中,而不會單獨(dú)存在,當(dāng)channel關(guān)閉時,其上的所有channel也會關(guān)閉,需要的朋友可以參考下

Channel是什么

RabbitMQ是AMQP0-9-1協(xié)議的實(shí)現(xiàn),先來看看AMQP0-9-1協(xié)議中對通道Channel的闡述。

有些應(yīng)用程序需要與broker建立多個連接。但是,保持多個TCP連接同時打開是不可取的,因?yàn)檫@樣做會消耗系統(tǒng)資源,使配置防火墻更加困難。AMQP0-9-1的Connection可以多路復(fù)用,Channel可以被認(rèn)為是“共享一個TCP連接的輕量級連接”。

客戶端執(zhí)行的每個協(xié)議操作都發(fā)生在一個channel上。在特定channel上的通信與在另一個channel上的通信完全獨(dú)立,因此每個協(xié)議方法也都帶有信道ID(a.k.a)。一個整數(shù),代理和客戶端都使用它來確定該方法用于哪個通道。

channel僅存在于connection的上下文中,而不會單獨(dú)存在。當(dāng)channel關(guān)閉時,其上的所有channel也會關(guān)閉。

對于使用多個線程/進(jìn)程進(jìn)行處理的應(yīng)用程序,為每個線程/進(jìn)程打開一個新channel而不在它們之間共享channel是很常見的。

在普通的JAVAEE項(xiàng)目中,經(jīng)常采用1個進(jìn)程-1個connection-1個channel。

但是這在JAVAWEB場景中實(shí)不可取的。

一個web項(xiàng)目僅有1個進(jìn)程,會有非常多的線程,每個線程都創(chuàng)建一個connection是不可取的。

在AMQP-0-9-1協(xié)議中推薦了使用每個線程使用一個獨(dú)立的channel,這樣不同線程之間的channel相互獨(dú)立,并且公用同一個connection。

但是問題又來了,在并發(fā)情況下,web場景下,用戶的每一次http請求都是一個線程,難道這樣的每一個http請求都要對應(yīng)創(chuàng)建一個channel嗎?

Spring在集成RabbitMQ時對這個問題有了非常好的解決。

Spring如何管理Channel?

springboot使用了RabbitMQ中的IO多路復(fù)用的理念,并對這種方案在web場景下進(jìn)行了優(yōu)化,盡可能的復(fù)用空閑中的channel。

boot默認(rèn)使用 CachingConnectionFactory 對 Connection 和空閑 Channel 進(jìn)行緩存。

看看Spring中的RabbitMQ是如何工作的:

Spring中對RabbitMQ的消息操作都是通過一個Template模板對象 RabbitTemplate ,該對象中封裝了對消息的接受和發(fā)送的各種重載方法。

消息的send都需要調(diào)用一個核心私有方法 doExcute() 。

在這里插入圖片描述

管理RabbitMQ中的事務(wù)Channel

Spring也是通過 TransactionSupport 進(jìn)行管理RabbitMQ中的事務(wù)Channel。

這一點(diǎn)和MyBatis的 SqlSessionTemplate 管理開啟事務(wù)的 SqlSession 的步驟相同。

這里不多贅述如果管理事務(wù)的channel

1.當(dāng)?shù)谝淮斡姓埱筮B接rabbitmq時,spring創(chuàng)建一個AMQP的connection,并使用CachingConnectionFactory將其封裝并緩存起來。

在這里插入圖片描述

2.然后使用這個connection,創(chuàng)建channel,當(dāng)channel的任務(wù)執(zhí)行完成后(也就是邏輯close時,并非真正的關(guān)閉了channel,而是在內(nèi)存中給channel創(chuàng)建了一個標(biāo)記。)

則使用 CachingConnectionFactory 的靜態(tài)子類 ChannelConnectionFactoryProxy 把這個channel緩存到一個空閑列表中。開啟了事務(wù)的channel存放在不同的列表中。

在這里插入圖片描述

3.其他線程執(zhí)行任務(wù)時,CachingConnectionFactory中獲取connection,然后創(chuàng)建channel時,會去ChannelConnectionFactoryProxy的空閑列表中尋找哪些channel是open狀態(tài)。

然后將尋找到的一個channel移出列表,并使用這個channel執(zhí)行任務(wù)。(取出緩存中的channel這一過程是同步代碼塊, 開啟了事務(wù)的channel存放在不同的列表中。)

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

4.任務(wù)執(zhí)行完畢,將channel在緩存入空閑列表中。默認(rèn)最多緩存25個channel

在這里插入圖片描述

在這里插入圖片描述

到此這篇關(guān)于SpringBoot管理RabbitMQ中的Channel詳解的文章就介紹到這了,更多相關(guān)SpringBoot管理Channel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java隨機(jī)數(shù)生產(chǎn)算法實(shí)例

    java隨機(jī)數(shù)生產(chǎn)算法實(shí)例

    下面小編就為大家?guī)硪黄猨ava隨機(jī)數(shù)生產(chǎn)算法實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • SpringBoot整合SQLite數(shù)據(jù)庫全過程

    SpringBoot整合SQLite數(shù)據(jù)庫全過程

    sqlite是一個很輕量級的數(shù)據(jù)庫,可以滿足日常sql的需求,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合SQLite數(shù)據(jù)庫的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • IDEA創(chuàng)建Servlet程序的兩種實(shí)現(xiàn)方法

    IDEA創(chuàng)建Servlet程序的兩種實(shí)現(xiàn)方法

    Servlet是JavaWeb應(yīng)用程序中不可或缺的組件之一,本文主要介紹了IDEA創(chuàng)建Servlet程序的兩種實(shí)現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Spring Boot實(shí)現(xiàn)分片上傳、斷點(diǎn)續(xù)傳與進(jìn)度條功能

    Spring Boot實(shí)現(xiàn)分片上傳、斷點(diǎn)續(xù)傳與進(jìn)度條功能

    本文介紹了如何使用SpringBoot實(shí)現(xiàn)分片上傳、斷點(diǎn)續(xù)傳和進(jìn)度條等功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-02-02
  • log4j2使用filter過濾日志方式

    log4j2使用filter過濾日志方式

    這篇文章主要介紹了log4j2使用filter過濾日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Springboot設(shè)置windows和Linux臨時上傳路徑方式

    Springboot設(shè)置windows和Linux臨時上傳路徑方式

    文章介紹了在Windows和Linux系統(tǒng)中設(shè)置臨時上傳路徑的方法,對于Windows系統(tǒng),可以通過修改注冊表或者環(huán)境變量來實(shí)現(xiàn),而對于Windows和Linux,可以在應(yīng)用程序中注入Bean來設(shè)置臨時上傳路徑
    2026-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)之二叉查找樹的實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之二叉查找樹的實(shí)現(xiàn)

    二叉查找樹(亦稱二叉搜索樹、二叉排序樹)是一棵二叉樹,且各結(jié)點(diǎn)關(guān)鍵詞互異,其中根序列按其關(guān)鍵詞遞增排列。本文將通過示例詳細(xì)講解二叉查找樹,感興趣的可以了解一下
    2022-03-03
  • Spring框架中的跨域CORS配置的完整教學(xué)

    Spring框架中的跨域CORS配置的完整教學(xué)

    CORS(Cross-Origin?Resource?Sharing,跨域資源共享)是一種機(jī)制,允許在瀏覽器中向不同源(域名、協(xié)議或端口不同)的服務(wù)器發(fā)起請求,下面我們就來看看如何在Spring框架配置跨域CORS吧
    2025-10-10
  • SpringBoot 緩存源碼分析

    SpringBoot 緩存源碼分析

    JSR107是Java規(guī)范請求,定義了緩存接口,如CachingProvider、CacheManager、Cache等,SpringCache是Spring對緩存的抽象,通過@EnableCaching開啟緩存注解,使用@Cacheable、@CachePut、@CacheEvict等注解進(jìn)行緩存操作,本文介紹SpringBoot 緩存的相關(guān)知識,感興趣的朋友一起看看
    2025-12-12
  • 淺談Java字符串比較的三種方法

    淺談Java字符串比較的三種方法

    這篇文章主要介紹了淺談Java字符串比較的三種方法,字符串比較是常見的操作,包括比較相等、比較大小、比較前綴和后綴串等,需要的朋友可以參考下
    2023-04-04

最新評論

柏乡县| 台江县| 仙居县| 长岭县| 兴海县| 集贤县| 都江堰市| 尉犁县| 通江县| 土默特右旗| 图木舒克市| 安丘市| 龙井市| 武夷山市| 当涂县| 太康县| 嘉善县| 通州区| 宝丰县| 大石桥市| 新乐市| 三河市| 曲麻莱县| 会东县| 商都县| 凯里市| 屯门区| 台南县| 米泉市| 深州市| 宣恩县| 吉隆县| 安吉县| 友谊县| 顺平县| 汝南县| 陆河县| 勐海县| 同心县| 淮滨县| 黄龙县|