Im Threadpooltaskexecutor und JMS wird nur ein Thread verwendet
-
26-10-2019 - |
Frage
Ich habe einen JMS Message -Listener unter JBoss 5.1, der von Spring konfiguriert ist. Obwohl der Threadpooltaskexecutor so konfiguriert ist, dass er eine Kernpool -Größe von 15 hat, sehe ich, dass nur ein Thread Anfragen serviert und die anderen warten. Laut dem Threadpoolexecutor -API Ich muss eine begrenzte Warteschlange haben, aber ich sehe nicht, wie Frühling es mir erlaubt, es zu tun.
Hier ist die Konfiguration:
<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>
Hier ist die Stapelspur der 14 wartenden Fäden:
"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)
Beachten Sie, dass dies ähnlich ist wie Spring Threadpooltaskexecutor nur einen Thread ausführt, Aber in meinem Fall ist die Kernpoolgröße größer als 1.
Lösung
Frühlingsreferenz sagt, dass Sie die maximale Anzahl gleichzeitiger Verbraucher mit angeben müssen <jms:listener-container concurrency = "15" ...>
, sonst wäre es 1.