欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于RabbitMQ的Channel默認(rèn)線程

 更新時(shí)間:2023年09月01日 10:33:17   作者:m0_46522672  
這篇文章主要介紹了關(guān)于RabbitMQ的Channel默認(rèn)線程,通過jvm工具觀察rabbitmq的線程使用情況,發(fā)現(xiàn)生產(chǎn)者每發(fā)一條消息,消費(fèi)者這邊就會(huì)創(chuàng)建一條線程,言下之意,一個(gè)channel當(dāng)消息來(lái)到時(shí)就會(huì)異步處理這些消息,需要的朋友可以參考下

前言

最近做了一個(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)文章

  • Java處理多API請(qǐng)求的方法詳解

    Java處理多API請(qǐng)求的方法詳解

    Java?中的并發(fā)是指語(yǔ)言并行運(yùn)行多個(gè)線程的能力,允許同時(shí)執(zhí)行多個(gè)任務(wù),
    2023-10-10
  • 非常全面的Java異常處理(全文干貨,值得收藏)

    非常全面的Java異常處理(全文干貨,值得收藏)

    這篇文章主要給大家介紹了非常全面的Java異常處理的相關(guān)資料,全文干貨,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 最新Spring?Security實(shí)戰(zhàn)教程之表單登錄定制到處理邏輯的深度改造(最新推薦)

    最新Spring?Security實(shí)戰(zhàn)教程之表單登錄定制到處理邏輯的深度改造(最新推薦)

    本章節(jié)介紹了如何通過Spring Security實(shí)現(xiàn)從配置自定義登錄頁(yè)面、表單登錄處理邏輯的配置,并簡(jiǎn)單模擬了前后分離的適配方案,本章節(jié)我們將Spring?Security?默認(rèn)表單進(jìn)行登錄定制到處理邏輯的深度改造,感興趣的朋友一起看看吧
    2025-03-03
  • java實(shí)現(xiàn)選課系統(tǒng)

    java實(shí)現(xiàn)選課系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)選課系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • java實(shí)現(xiàn)時(shí)間控制的幾種方案

    java實(shí)現(xiàn)時(shí)間控制的幾種方案

    這篇文章主要介紹了java實(shí)現(xiàn)時(shí)間控制的幾種方案,本文從多個(gè)方面給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • java使用靜態(tài)關(guān)鍵字實(shí)現(xiàn)單例模式

    java使用靜態(tài)關(guān)鍵字實(shí)現(xiàn)單例模式

    這篇文章主要為大家詳細(xì)介紹了java使用靜態(tài)關(guān)鍵字實(shí)現(xiàn)單例模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Java中使用Preconditions來(lái)檢查傳入?yún)?shù)介紹

    Java中使用Preconditions來(lái)檢查傳入?yún)?shù)介紹

    這篇文章主要介紹了Java中使用Preconditions來(lái)檢查傳入?yún)?shù)介紹,本文只是作為一個(gè)簡(jiǎn)單的用法介紹,需要的朋友可以參考下
    2015-06-06
  • Java設(shè)計(jì)模式之備忘錄模式(Memento模式)介紹

    Java設(shè)計(jì)模式之備忘錄模式(Memento模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之備忘錄模式(Memento模式)介紹,memento是一個(gè)保存另外一個(gè)對(duì)象內(nèi)部狀態(tài)拷貝的對(duì)象,這樣以后就可以將該對(duì)象恢復(fù)到原先保存的狀態(tài),需要的朋友可以參考下
    2015-03-03
  • Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之?dāng)?shù)組

    Java?數(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-02
  • Java更新調(diào)度器(update scheduler)的使用詳解

    Java更新調(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

最新評(píng)論