Как создать пул потокового слушателя JMS - PullRequest
4 голосов
/ 27 апреля 2011

Я настраиваю прослушиватель подписчика JMS следующим образом с целью создания пула из 5 потоков, слушающих topATopic, однако во время выполнения я вижу, что несколько потребителей обрабатывают одну и ту же запись (recordCount * # потребителей).

Я предполагаю, что делаю что-то не так, учитывая, что я новичок в весне.

<bean id="messageListener" class="com.abc.app.mdp.Receiver">
<property name="bean" ref="bean" />
</bean>

<jms:listener-container container-type="default"
connection-factory="connectionFactory" acknowledge="auto" concurrency="5" destination-type="topic" prefetch="1" cache="none" >
<jms:listener destination="topCli_Service" ref="messageListener" 
method="onMessage" subscription="AProjectSubscriber" />
</jms:listener-container>

<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryB ean">
<property name="jndiName" value="jms/jms-top-notx" />
</bean>

Может кто-нибудь подсказать мне направление в направлении достижения моей цели?

Ответы [ 2 ]

9 голосов
/ 27 апреля 2011

Посмотрите на параметр одновременность в конфигурации вашего контейнера слушателя. Spring JMS doc предполагает, что для слушателей темы следует установить значение 1 для параллелизма. Смотри ниже.

одновременность: количество одновременных сеансов / потребителей, запускаемых для каждого слушателя. Может быть простым числом, указывающим максимальное число (например, «5»), или диапазоном, обозначающим как нижний, так и верхний предел (например, «3-5»). Обратите внимание, что указанный минимум является лишь подсказкой и может игнорироваться во время выполнения. По умолчанию 1; сохранить параллелизм ограниченным 1 в случае слушателя темы или, если порядок очередей важен; рассмотрите возможность поднять его для общих очередей.

Этот пост похож на остальную часть вашего вопроса.

Если вам нужно, чтобы несколько потоков соответствовали объему сообщения, ваш прослушиватель сообщений может делегировать Spring TaskExecutor для асинхронной обработки сообщений. TaskExecutors могут поддерживаться рядом реализаций, включая Thread Pool.

2 голосов
/ 27 апреля 2011

Если вы хотите, чтобы данное сообщение использовалось одним и только одним потребителем, вы должны использовать Очередь вместо Темы.Сообщение «Тема» передается всем доступным пользователям.

...