В Threadpooltaskexecutor и JMS используется только один поток и JMS

StackOverflow https://stackoverflow.com/questions/5328212

Вопрос

У меня есть прослушиватель сообщения JMS под JBOSS 5.1, настроенный на Spring. Хотя ThreadPooltaskexeCutor настраивается, чтобы иметь размер основного бассейна 15, я вижу, что только один поток подает запросы, а другие ждут. Согласно 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.

Это было полезно?

Решение

Весенняя ссылка говорит, что вам нужно указать максимальное количество одновременных потребителей с <jms:listener-container concurrency = "15" ...>, в противном случае это будет 1.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top