ThreadPooltasKexecutorとJMSで使用されているスレッドは1つだけです
-
26-10-2019 - |
質問
JBOSS 5.1の下にJMSメッセージリスナーがあり、Springで構成されています。 ThreadPooltasKexecutorは15のコアプールサイズを持つように構成されていますが、リクエストを提供しているスレッドは1つだけで、他のスレッドが待っていることがわかります。による ThreadPoolexecutor API 境界のあるキューが必要ですが、春がそれをする方法がわかりません。
これが構成です:
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:/ConnectionFactory" />
<property name="jndiTemplate" ref="jndiTemplate" />
</bean>
<bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="queue/someQueue" />
<property name="jndiTemplate" ref="jndiTemplate" />
</bean>
<bean id="jmsReceiveDestinationResolver"
class="org.springframework.jms.support.destination.JndiDestinationResolver">
<property name="jndiTemplate" ref="jndiTemplate" />
</bean>
<bean id="someListener" class="com.company.SomeListener">
<property name="..." ref="..." />
</bean>
<jms:listener-container connection-factory="connectionFactory"
destination-type="queue" destination-resolver="jmsReceiveDestinationResolver"
task-executor="jmsTaskExecutor">
<jms:listener destination="queue/someQueue" ref="messageListener" />
</jms:listener-container>
<bean name="jmsTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="15"/>
<property name="maxPoolSize" value="50"/>
<property name="threadNamePrefix" value="some-queue-thread"/>
</bean>
14の待機スレッドのスタックトレースは次のとおりです。
"some-queue-thread7" prio=10 tid=0x000000004dcfc800 nid=0x1d90 waiting on condition [0x00000000435f7000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000070f5abad8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:662)
これに似ている可能性があります spring threadpooltaskexecutor 1つのスレッドのみを実行します, 、しかし、私の場合、コアプールサイズは1より大きくなっています。
解決
スプリングリファレンス 同時消費者の最大数を指定する必要があると言います <jms:listener-container concurrency = "15" ...>
, 、それ以外の場合は1になります。
所属していません StackOverflow