RabbitMQ(八)線程池消費


 

 

配置

    <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" id="taskExecutor">
        <!--核心線程數 -->
        <property name="corePoolSize" value="200"/>
        <!--最大線程數 -->
        <property name="maxPoolSize" value="200"/>
        <property name="queueCapacity" value="500"/>
        <!--線程池維護線程所允許的空閑時間 -->
        <property name="keepAliveSeconds" value="60"/>
        <!--線程池對拒絕任務(無線程可用)的處理策略 -->
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
        </property>
        <property name="WaitForTasksToCompleteOnShutdown" value="true"/>
    </bean>
    
  <bean id="consumer_1" class="me.ele.Consumer1"/>
............
<rabbit:listener-container connection-factory="monitorConnectionFactory" acknowledge="manual" task-executor="taskExecutor" prefetch="10" concurrency="20"> <rabbit:listener queues="queue_1" ref="consumer_1"/> <rabbit:listener queues="queue_2" ref="consumer_2"/> <rabbit:listener queues="queue_3" ref="consumer_3"/> <rabbit:listener queues="queue_4" ref="consumer_4"/> <rabbit:listener queues="queue_5" ref="consumer_5"/> <rabbit:listener queues="queue_6" ref="consumer_6"/> </rabbit:listener-container>

 

問題:Consumer數量不足

部分隊列consumer數量不足,缺失項始終為xml中聲明在后的隊列。

問題原因:多個queue的consumer會共用taskExecutor的線程池數量,如果線程池數量不足,consumer無法創建,

 解決方法:這時要增大task-executor corePoolSize和maxPoolSize的值。

 

總結

  • concurrency的線程,是包含在task-executor內部的.而且是會一直使用的,並不會釋放的
  • pool-size >= concurrency(所有配置了concurrency的總和 <= 使用同一個executor線程池大小),這只是最低限度.
  • 使用concurrency,要計算一下,所有使用該executor的配置估計下至少要使用多少條線程。最好使用彈性的線程池(pool-size=“3-5”)這種配置,不過這樣子的話,就一定要配置execuotr的queue-capacity.
  • 使用concurrency,但去掉executor即可,這樣了,Spring就會按需自動new線程了.

 

 

引用:

https://juejin.im/post/5b94d290e51d450e8d762c37

https://emacsist.github.io/2015/12/17/%E5%BD%BB%E5%BA%95%E4%BA%86%E8%A7%A3spring-%E4%B8%AD-rabbitmq%E9%85%8D%E7%BD%AE%E7%9A%84concurrency-%E5%92%8C-task-executor/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM