[英]Multiple DefaultMessageListenerContainer feeding a single TaskExecutor/ThreadPool (fairly)
[英]Spring - DefaultMessageListenerContainer TaskExecutor Thread monitoring
我在DefaultMessageListenerContainer內使用SimpleAsyncTaskExecutor,我想使用JMX mbean監視活動線程數。 我已經創建並連接了mbean,但是在JConsole上進行監視時,taskExecutor上的活動線程數仍保持為創建時的值。 隨着DMLC接收入站消息,它不會波動。 這個數字不應該波動嗎? 這是Spring在SimpleAsyncTaskExecutor上的文章:
SimpleAsyncTaskExecutor: 此實現不重用任何線程,而是為每次調用啟動一個新線程。 但是,它確實支持並發限制,該限制將阻止超出限制的所有調用,直到釋放插槽為止。 如果您正在尋找真正的池,請繼續向下滾動頁面。 Spring框架任務執行和調度
這是我使用Spring-jms 3.0.3.RELEASE的設置:
<bean id="inboundMessageAdaptorMessageContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="singleJMSConnectionFactory" />
<property name="destination" ref="eventReceiveQueue" />
<property name="sessionTransacted" value="true" />
<property name="messageListener" ref="inboundMessageRetryingListenerAdapter" />
<property name="concurrentConsumers" value="15" />
</bean>
我的Mbean公開了DMLC中的字段。 它在TaskExecutor的超類上獲取私有字段threadCount:
Field taskExecutorField = dmlc.getClass().getDeclaredField("taskExecutor");
taskExecutorField.setAccessible(true);
taskExecutor = (SimpleAsyncTaskExecutor) taskExecutorField.get(dmlc);
threadCountField = taskExecutor.getClass().getSuperclass().getDeclaredField("threadCount");
threadCountField.setAccessible(true);
return (int) threadCountField.get(taskExecutor);
我曾嘗試對DMLC上的設置(如IdleTaskExecutionLimit和CacheLevel)進行調整,但是它們並沒有達到我的目標。 我希望能夠找到不涉及創建新類或向具體類添加其他方法的內容。
沒有; 它只會出現波動,如果maxConcurrentConsumers
大於concurrentConsumers
,在這種情況下,容器將調整對需求的線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.