我们在JMS使用者中使用ThreadPoolExecutor并将其注入DefaultMessageListenerContainer。我希望这会为许多消息运行并发线程,但是我们的日志显示线程id不会改变。我们的日志记录显示,对于不同的消息处理,线程id在24处始终是相同的。
这是该场景中的弹簧配置:
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer"
p:connectionFactory-ref="cachedConnectionFactory"
p:destination-ref="formsCRRDestination"
p:messageListener-ref="formServicePojo"
p:concurrentConsumers="5"
p:idleTaskExecutionLimit="1"
p:maxConcurrentConsumers="25"
p:taskExecutor-ref="threadPoolExecutor"
destroy-method="doShutdown"
>
<bean id="threadPoolExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" >
<property name="corePoolSize" value="1"/>
<property name="maxPoolSize" value="15"/>
<property name="keepAliveSeconds" value="30"/>
</bean>
在不将threadPoolExectuor bean注入DefaultMessageListenerContainer之后,消息现在正在不同的线程中执行。
这是最终的配置:
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer"
p:connectionFactory-ref="cachedConnectionFactory"
p:destination-ref="formsCRRDestination"
p:messageListener-ref="formServicePojo"
p:concurrentConsumers="5"
p:idleTaskExecutionLimit="1"
p:maxConcurrentConsumers="25"
destroy-method="doShutdown"
>
我试过阅读文档,但我不明白为什么会这样。有什么解释吗?
答案 0 :(得分:34)
试试这个:
<bean id="threadPoolTaskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="25" />
<property name="queueCapacity" value="30" />
</bean>
答案 1 :(得分:17)
完成ThreadPoolTaskExecutor code in Spring并阅读ThreadPoolTaskExecutor的Java文档后,我认为这就是答案:
无限队列。使用无界 队列(例如a LinkedBlockingQueue没有 预定义的容量)将导致新的 在所有情况下排队的任务 corePoolSize线程很忙。从而, 不会超过corePoolSize线程 永远被创造。 (和的价值 因此maximumPoolSize没有 任何影响。)
在上面的配置中,我们默认使用LinkedBlockingQueue,我们的corePoolSize为1.这就是maximumPoolSize不会产生任何影响的原因。
答案 2 :(得分:14)
我认为选择的答案是错误的。 IIRC,ThreadPoolTaskExecutor(最终在JDK中的ThreadPoolExecutor)工作的方式是
所以我认为这里的问题是:1)你的消费者足够快或2)你堆栈请求太慢,所以你用corePoolSize指定的一个线程足以处理新的传入请求+排队任务而不允许ThreadPoolTaskExecutor创建新线程。我很确定如果你更难推动或者用较小的数字设置队列的容量(比如5~10),你就能看到线程的数量在增加。
答案 3 :(得分:3)
将corePoolSize更改为10,然后您将同时运行10个线程。 阅读java.util.concurrent.ThreadPoolExecutor上的javadoc,它是spring ThreadPoolTaskExecutor的主干,然后你将更好地理解如何配置corePoolSize和maxPoolSize以及queueCapacity