關(guān)于RabbitMQ的Channel默認(rèn)線程
前言
最近做了一個(gè)小功能,是通過一個(gè)客戶端消費(fèi)者監(jiān)聽隊(duì)列消息, 代碼如下:
Connection conn = getConnection(); Channel channel = conn.createChannel(); MessageConsumer consumer = ... channel.basicConsume(realQueue, true, consumer);
通過jvm工具觀察rabbitmq的線程使用情況,發(fā)現(xiàn)生產(chǎn)者每發(fā)一條消息,消費(fèi)者這邊就會(huì)創(chuàng)建一條線程, 言下之意,一個(gè)channel當(dāng)消息來(lái)到時(shí)就會(huì)異步處理這些消息.
定位
通過斷點(diǎn)查找發(fā)現(xiàn)原來(lái)是 ConsumerWorkService這個(gè)類控制的。
這個(gè)類顧名思義,就是消費(fèi)者工作 ExecutorService, 這里的Service表示的是ExecutorService
這個(gè)類構(gòu)造函數(shù)里有一個(gè)executor參數(shù),當(dāng)這個(gè)參數(shù)為空時(shí),就會(huì)創(chuàng)建一個(gè)Executors.newFixedThreadPool,代碼如下:
final public class ConsumerWorkService { private static final int MAX_RUNNABLE_BLOCK_SIZE = 16; private static final int DEFAULT_NUM_THREADS = Runtime.getRuntime().availableProcessors() * 2; private final ExecutorService executor; private final boolean privateExecutor; private final WorkPool<Channel, Runnable> workPool; private final int shutdownTimeout; public ConsumerWorkService(ExecutorService executor, ThreadFactory threadFactory, int queueingTimeout, int shutdownTimeout) { this.privateExecutor = (executor == null); this.executor = (executor == null) ? Executors.newFixedThreadPool(DEFAULT_NUM_THREADS, threadFactory) : executor; this.workPool = new WorkPool<>(queueingTimeout); this.shutdownTimeout = shutdownTimeout; } ...
默認(rèn)的executor 會(huì)使用 CPU核數(shù)的2倍 作為線程池里線程的數(shù)量。
所以到底是要用多個(gè)channel,還是單個(gè)channel,這個(gè)就是其中一個(gè)參考依據(jù)。
executor是怎么傳進(jìn)來(lái)的
答案:
ConnectionFactory -> AMQConnection -> ChannelManager -> ConsumerWorkService
ConnectionFactory有一個(gè)屬性是 shareExecutorService ,這個(gè)屬性表示內(nèi)部使用共享的唯一一個(gè)ExecutorService 設(shè)置這個(gè)屬性就可以一直傳到ConsumerWorkService中。
除了ConnectionFactory.setShareExecutorService方法以外, 還可以在Connection被創(chuàng)建時(shí),設(shè)置executorService ConnectionFactory的newConnection方法:
public Connection newConnection(ExecutorService executor) throws IOException, TimeoutException;
總結(jié)
通過設(shè)置shareExecutorService,無(wú)論多少個(gè)channel,都可以統(tǒng)一控制線程數(shù)量、隊(duì)列數(shù)量, 根據(jù)實(shí)際情況進(jìn)行配置。
public class RabbitMqUtil { public static Channel getChannel() throws Exception{ //創(chuàng)建一個(gè)連接工廠 ConnectionFactory factory = new ConnectionFactory(); //連接服務(wù)器 factory.setHost("114.***.***.***"); //用戶名 factory.setUsername("admin"); //密碼 factory.setPassword("123"); //創(chuàng)建連接 // ExecutorService executor = Executors.newFixedThreadPool(1); 設(shè)置線程池中的個(gè)數(shù),把executor傳給newConnection() Connection connection = factory.newConnection(); //獲取信道 Channel channel = connection.createChannel(); return channel; } }
到此這篇關(guān)于關(guān)于RabbitMQ的Channel默認(rèn)線程的文章就介紹到這了,更多相關(guān)RabbitMQ的Channel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
最新Spring?Security實(shí)戰(zhàn)教程之表單登錄定制到處理邏輯的深度改造(最新推薦)
本章節(jié)介紹了如何通過Spring Security實(shí)現(xiàn)從配置自定義登錄頁(yè)面、表單登錄處理邏輯的配置,并簡(jiǎn)單模擬了前后分離的適配方案,本章節(jié)我們將Spring?Security?默認(rèn)表單進(jìn)行登錄定制到處理邏輯的深度改造,感興趣的朋友一起看看吧2025-03-03java實(shí)現(xiàn)時(shí)間控制的幾種方案
這篇文章主要介紹了java實(shí)現(xiàn)時(shí)間控制的幾種方案,本文從多個(gè)方面給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07java使用靜態(tài)關(guān)鍵字實(shí)現(xiàn)單例模式
這篇文章主要為大家詳細(xì)介紹了java使用靜態(tài)關(guān)鍵字實(shí)現(xiàn)單例模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Java中使用Preconditions來(lái)檢查傳入?yún)?shù)介紹
這篇文章主要介紹了Java中使用Preconditions來(lái)檢查傳入?yún)?shù)介紹,本文只是作為一個(gè)簡(jiǎn)單的用法介紹,需要的朋友可以參考下2015-06-06Java設(shè)計(jì)模式之備忘錄模式(Memento模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之備忘錄模式(Memento模式)介紹,memento是一個(gè)保存另外一個(gè)對(duì)象內(nèi)部狀態(tài)拷貝的對(duì)象,這樣以后就可以將該對(duì)象恢復(fù)到原先保存的狀態(tài),需要的朋友可以參考下2015-03-03Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之?dāng)?shù)組
數(shù)組是有序的元素序列,若將有限個(gè)類型相同的變量的集合命名,那么這個(gè)名稱為數(shù)組名。組成數(shù)組的各個(gè)變量稱為數(shù)組的分量,也稱為數(shù)組的元素,有時(shí)也稱為下標(biāo)變量。數(shù)組是在程序設(shè)計(jì)中,為了處理方便, 把具有相同類型的若干元素按有序的形式組織起來(lái)的一種形式2022-02-02Java更新調(diào)度器(update scheduler)的使用詳解
Java更新調(diào)度器是Java中的一個(gè)特性,可以自動(dòng)化Java應(yīng)用程序的更新過程,它提供了一種方便的方式來(lái)安排Java應(yīng)用程序的更新,確保其與最新的功能、錯(cuò)誤修復(fù)和安全補(bǔ)丁保持同步,本文將深入介紹如何使用Java更新調(diào)度器,并解釋它對(duì)Java開發(fā)人員和用戶的好處2023-11-11