2011-03-16 6 views
2

私はJBoss 5.1の下にJMSによってJMSを設定し、Springによって設定されています。 ThreadPoolTask​​Executorはコアプールのサイズが15になるように設定されていますが、リクエストを処理しているスレッドは1つのみで、他のスレッドは待機しています。 ThreadPoolExecutor APIによれば、私は境界のあるキューを持つ必要がありますが、私は春が私にそれをさせる方法を見ません。ここでThreadPoolTask​​ExecutorとJMSで使用されるスレッドは1つだけです

構成です:ここでは

<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 only running one threadに似かもしれないが、私の場合、コアプールサイズがあります

答えて

2

Spring Referenceは、同時コンシューマの最大数を<jms:listener-container concurrency = "15" ...>と指定する必要があり、otherwisそれは1になるでしょう。

+0

ありがとう、それはそれを解決しました(30に増加) –