Spring - DefaultMessageListenerContainer TaskExecutor线程监视

时间:2014-07-15 16:42:14

标签: java multithreading spring spring-integration mbeans

我在DefaultMessageListenerContainer中使用SimpleAsyncTaskExecutor,我想使用JMX mbean监视活动线程数。我创建并连接了mbean,但是在JConsole上进行监视时,taskExecutor上的活动线程数仍然保持在创建它的值。当DMLC接收入站消息时,它不会波动。这个数字不应该波动吗?这是Spring在SimpleAsyncTaskExecutor上的写法:

  

SimpleAsyncTaskExecutor:此实现不重用任何线程,而是为每次调用启动一个新线程。但是,它确实支持并发限制,该限制将阻止超出限制的任何调用,直到一个插槽已被释放。如果您正在寻找真正的池,请继续向下滚动页面。 Spring Framework Task Execution and Scheduling

这是我使用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>

My 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,但是他们没有实现我的目标。我希望能够找到一些不涉及创建新类或向具体类添加其他方法的内容。

1 个答案:

答案 0 :(得分:1)

没有;它只会在maxConcurrentConsumers大于concurrentConsumers时发生波动,在这种情况下,容器会根据需要调整线程。

相关问题