![](/img/trans.png)
[英]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.