亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是SimpleMessageListenerContainer和DirectMessageListenerContainer

發布時間:2021-10-13 13:53:32 來源:億速云 閱讀:311 作者:iii 欄目:編程語言

這篇文章主要介紹“什么是SimpleMessageListenerContainer和DirectMessageListenerContainer”,在日常操作中,相信很多人在什么是SimpleMessageListenerContainer和DirectMessageListenerContainer問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是SimpleMessageListenerContainer和DirectMessageListenerContainer”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

RabbitMQ 消費者代碼開發過程中會使用到 SimpleMessageListenerContainer 和 DirectMessageListenerContainer。
在版本2.0之前的版本中,只有一種MessageListenerContainer 即 SimpleMessageListenerContainer; 2.0之后有第二個容器—DirectMessageListenerContainer

一、SimpleMessageListenerContainer

默認情況下,偵聽器容器將啟動單個使用者,該使用者將從隊列接收消息。根據之前的文檔,我們知道有許多控制并發性的屬性。
最簡單的是concurrentConsumers,它只創建(固定的)將并發處理消息的使用者數量。
此外,還添加了一個新的屬性 maxConcurrentConsumers,容器將根據工作負載動態調整并發性。這與四個附加屬性一起工作:continutiveactivetrigger、startConsumerMinInterval、continutiveidletrigger、stopConsumerMinInterval。

1.1、在默認設置下,增加消費者的算法工作如下

如果尚未到達maxConcurrentConsumers,并且已有的使用者連續10個周期處于活動狀態,并且自上一個使用者啟動以來至少已經過了10秒,那么將啟動一個新的使用者。如果使用者在txSize *中接收到至少一條消息,則認為該使用者處于活動狀態。

1.2、在默認設置下,減少消費者的算法工作如下

如果有多個concurrentConsumers正在運行,并且某個consumer檢測到10個連續超時(空閑),并且上一個consumer至少在60秒之前停止,那么該consumer將停止。超時取決于receiveTimeout和txSize屬性。如果使用者在txSize *中沒有接收到任何消息,則認為它是空閑的。因此,在默認超時(1秒)和txSize為4的情況下,在40秒的空閑時間(4個超時對應1個空閑檢測)之后將考慮停止使用者。

1.3、配置如下
@Bean
public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory){
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    //初始化消費者數量
    factory.setConcurrentConsumers(this.concurrentConsumers);
    //最大消費者數量
    factory.setMaxConcurrentConsumers(this.maxConcurrentConsumers);
    //手動確認消息
    factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
    factory.setErrorHandler(rabbitErrorHandler);
    return factory;
}

二、DirectMessageListenerContainer

使用 DirectMessageListenerContainer,您需要確保 ConnectionFactory 配置了一個任務執行器,該執行器在使用該 ConnectionFactory 的所有偵聽器容器中具有足夠的線程來支持所需的并發性。默認連接池大小僅為5。
并發性基于配置的隊列和consumersPerQueue。每個隊列的每個使用者使用一個單獨的通道,并發性由rabbit客戶端庫控制;默認情況下,它使用5個線程池;您可以配置taskExecutor來提供所需的最大并發性。

2.1、配置如下
@Bean
public DirectRabbitListenerContainerFactory directRabbitListenerContainerFactory(ConnectionFactory connectionFactory){
    DirectRabbitListenerContainerFactory factory = new DirectRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    //每個隊列的消費者數量
    factory.setConsumersPerQueue(this.consumersPerQueue);
    //手動確認消息
    factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
    factory.setErrorHandler(rabbitErrorHandler);
    return factory;
}

三、服務對比

SimpleMessageListenerContainer提供了以下特性,但DirectMessageListenerContainer不提供:

  1. txSize—使用SimpleMessageListenerContainer,您可以將其設置為控制事務中傳遞的消息數量和/或減少ack的數量,但這可能會導致失敗后重復傳遞的數量增加。(與txSize和SimpleMessageListenerContainer一樣,DirectMessageListenerContainer也有mesagesPerAck,可以用來減少ack,但不能用于事務—每個消息都在單獨的事務中交付和打包)。

  2. maxconcurrentconsumer和consumer伸縮間隔/觸發器—DirectMessageListenerContainer中沒有自動伸縮;但是,它允許您以編程方式更改consumersPerQueue屬性,并相應地調整使用者。

然而,與SimpleMessageListenerContainer相比,DirectMessageListenerContainer有以下優點:

  1. 在運行時添加和刪除隊列更有效;使用SimpleMessageListenerContainer,整個使用者線程重新啟動(所有使用者取消并重新創建);對于DirectMessageListenerContainer,不受影響的使用者不會被取消。

  2. 避免了RabbitMQ客戶機線程和使用者線程之間的上下文切換。

  3. 線程是跨使用者共享的,而不是為SimpleMessageListenerContainer中的每個使用者都有一個專用線程。

到此,關于“什么是SimpleMessageListenerContainer和DirectMessageListenerContainer”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北宁市| 阳西县| 康定县| 巴南区| 汶川县| 江北区| 甘孜| 堆龙德庆县| 满城县| 昌江| 始兴县| 高安市| 滦平县| 贺兰县| 安徽省| 南丰县| 拉萨市| 齐河县| 嘉义市| 富锦市| 平顶山市| 长子县| 祁东县| 囊谦县| 霍州市| 克什克腾旗| 炎陵县| 阜南县| 海宁市| 兴安盟| 新河县| 米林县| 黄石市| 娄烦县| 岳普湖县| 嘉荫县| 安西县| 南雄市| 垣曲县| 越西县| 江源县|