Как создать пул потоков для прослушивателя Spring JMS

Я настраиваю прослушиватель подписчика 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>

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


person cmutt78    schedule 27.04.2011    source источник


Ответы (2)


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

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

Этот пост аналогичен остальной части вашего вопроса.

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

person MarkOfHall    schedule 27.04.2011
comment
Спасибо за ответ, это имеет смысл. Я тоже читал то, что вы поместили в рамку выше, в документации. Думаю, теперь мне нужно найти пример делегирования TaskExecutor. Однако по какой-то причине найти пример было сложно. :( - person cmutt78; 27.04.2011

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

person Joseph Ottinger    schedule 27.04.2011
comment
Конечно, в этом есть смысл. Но вы не можете просто сказать «хорошо», ЭТО тематическое сообщение отправляется одному и только одному потребителю, в то время как ЭТО тематическое сообщение отправляется им всем, за пределами (возможно) селекторов. Селекторы МОГУТ помочь (читать сообщения, предназначенные «всем» или мне), но обычно они очень медленные, а поддержка нерегулярная. - person Joseph Ottinger; 27.04.2011
comment
Я понимаю, о чем вы говорите выше, но, возможно, я неправильно понял свой вопрос. Все, что я просто пытаюсь достичь, это вместо того, чтобы последовательно извлекать записи из темы с использованием определенного подписчика, я хочу использовать пул потоков из x потоков. Я знаю, как это сделать, используя EJB в дескрипторах развертывания, но с тех пор, как я новичок в Spring, я пытаюсь найти эквивалент. - person cmutt78; 27.04.2011