什么是SimpleMessageListenerContainer和DirectMessageListenerContainer

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

創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設、做網(wǎng)站、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務東陽,十多年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18982081108

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

一、SimpleMessageListenerContainer

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

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

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

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

如果有多個concurrentConsumers正在運行,并且某個consumer檢測到10個連續(xù)超時(空閑),并且上一個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);
    //初始化消費者數(shù)量
    factory.setConcurrentConsumers(this.concurrentConsumers);
    //最大消費者數(shù)量
    factory.setMaxConcurrentConsumers(this.maxConcurrentConsumers);
    //手動確認消息
    factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
    factory.setErrorHandler(rabbitErrorHandler);
    return factory;
}

二、DirectMessageListenerContainer

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

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

三、服務對比

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

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

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

然而,與SimpleMessageListenerContainer相比,DirectMessageListenerContainer有以下優(yōu)點:

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

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

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

到此,關于“什么是SimpleMessageListenerContainer和DirectMessageListenerContainer”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

當前名稱:什么是SimpleMessageListenerContainer和DirectMessageListenerContainer
轉載來于:http://muchs.cn/article10/pihido.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關鍵詞優(yōu)化、品牌網(wǎng)站設計、標簽優(yōu)化、域名注冊營銷型網(wǎng)站建設、外貿建站

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設