繁体   English   中英

春季-DefaultMessageListenerContainer TaskExecutor线程监视

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM