首页 文章

Spring - DefaultMessageListenerContainer TaskExecutor线程监视

提问于
浏览
0

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

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

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

1 回答

  • 1

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

相关问题