2011-03-16 2 views
2

Spring에서 구성된 JBoss 5.1 아래에 JMS 메시지 수신기가 있습니다. ThreadPoolTaskExecutor는 코어 풀 크기가 15로 구성되어 있지만 하나의 스레드 만 요청을 처리하고 다른 스레드는 대기 중임을 알 수 있습니다. ThreadPoolExecutor API에 따르면 제한된 대기열이 필요하지만 봄으로 어떻게 처리 할 수 ​​있는지 알지 못합니다. Spring ThreadPoolTaskExecutor only running one thread이 수도 있습니다 비슷한하지만 핵심 풀 크기가 내 경우에는하나의 스레드 만 ThreadPoolTaskExecutor 및 JMS에서 사용됩니다.

"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) 

공지 사항 : 여기

<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 개 대기하는 스레드의 스택 추적입니다 : 여기

구성입니다

답변

2

Spring Reference은 최대 동시 소비자 수를 <jms:listener-container concurrency = "15" ...>으로 지정해야한다고 지정하고 otherwis e가 1이됩니다.

+0

감사합니다. 해결되었으므로 (30으로 증가) –

관련 문제