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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top