這篇文章主要介紹“什么是SimpleMessageListenerContainer和DirectMessageListenerContainer”,在日常操作中,相信很多人在什么是SimpleMessageListenerContainer和DirectMessageListenerContainer問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是SimpleMessageListenerContainer和DirectMessageListenerContainer”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
創新互聯公司主要從事網站建設、做網站、網頁設計、企業做網站、公司建網站等業務。立足成都服務東陽,十多年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:18982081108
RabbitMQ 消費者代碼開發過程中會使用到 SimpleMessageListenerContainer 和 DirectMessageListenerContainer。
在版本2.0之前的版本中,只有一種MessageListenerContainer 即 SimpleMessageListenerContainer; 2.0之后有第二個容器—DirectMessageListenerContainer
默認情況下,偵聽器容器將啟動單個使用者,該使用者將從隊列接收消息。根據之前的文檔,我們知道有許多控制并發性的屬性。
最簡單的是concurrentConsumers,它只創建(固定的)將并發處理消息的使用者數量。
此外,還添加了一個新的屬性 maxConcurrentConsumers,容器將根據工作負載動態調整并發性。這與四個附加屬性一起工作:continutiveactivetrigger、startConsumerMinInterval、continutiveidletrigger、stopConsumerMinInterval。
如果尚未到達maxConcurrentConsumers,并且已有的使用者連續10個周期處于活動狀態,并且自上一個使用者啟動以來至少已經過了10秒,那么將啟動一個新的使用者。如果使用者在txSize *中接收到至少一條消息,則認為該使用者處于活動狀態。
如果有多個concurrentConsumers正在運行,并且某個consumer檢測到10個連續超時(空閑),并且上一個consumer至少在60秒之前停止,那么該consumer將停止。超時取決于receiveTimeout和txSize屬性。如果使用者在txSize *中沒有接收到任何消息,則認為它是空閑的。因此,在默認超時(1秒)和txSize為4的情況下,在40秒的空閑時間(4個超時對應1個空閑檢測)之后將考慮停止使用者。
@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,您需要確保 ConnectionFactory 配置了一個任務執行器,該執行器在使用該 ConnectionFactory 的所有偵聽器容器中具有足夠的線程來支持所需的并發性。默認連接池大小僅為5。
并發性基于配置的隊列和consumersPerQueue。每個隊列的每個使用者使用一個單獨的通道,并發性由rabbit客戶端庫控制;默認情況下,它使用5個線程池;您可以配置taskExecutor來提供所需的最大并發性。
@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不提供:
txSize—使用SimpleMessageListenerContainer,您可以將其設置為控制事務中傳遞的消息數量和/或減少ack的數量,但這可能會導致失敗后重復傳遞的數量增加。(與txSize和SimpleMessageListenerContainer一樣,DirectMessageListenerContainer也有mesagesPerAck,可以用來減少ack,但不能用于事務—每個消息都在單獨的事務中交付和打包)。
maxconcurrentconsumer和consumer伸縮間隔/觸發器—DirectMessageListenerContainer中沒有自動伸縮;但是,它允許您以編程方式更改consumersPerQueue屬性,并相應地調整使用者。
然而,與SimpleMessageListenerContainer相比,DirectMessageListenerContainer有以下優點:
在運行時添加和刪除隊列更有效;使用SimpleMessageListenerContainer,整個使用者線程重新啟動(所有使用者取消并重新創建);對于DirectMessageListenerContainer,不受影響的使用者不會被取消。
避免了RabbitMQ客戶機線程和使用者線程之間的上下文切換。
線程是跨使用者共享的,而不是為SimpleMessageListenerContainer中的每個使用者都有一個專用線程。
到此,關于“什么是SimpleMessageListenerContainer和DirectMessageListenerContainer”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!
當前名稱:什么是SimpleMessageListenerContainer和DirectMessageListenerContainer
轉載來于:http://m.kartarina.com/article10/pihido.html
成都網站建設公司_創新互聯,為您提供關鍵詞優化、品牌網站設計、標簽優化、域名注冊、營銷型網站建設、外貿建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯