配置
<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線程了.
引用: