Если вы хотите прослушивать сообщения из нескольких тем с использованием прямой Spring JMS, вам необходимо создать несколько экземпляров этого класса.Единственная проблема заключается в том, что по умолчанию каждый из них создает свой собственный TaskExecutor, что немного расточительно.Чтобы обойти это, просто определите свой собственный компонент taskExecutor
в контексте, и все слушатели сообщений будут использовать его автоматически.
Вот исполнитель задач, который хорошо работает в автономной виртуальной машине, есть альтернативные реализации, которые интегрируютс возможностями собственного менеджера работы / пула потоков различных контейнеров.
<bean id="taskExecutor" class="org.springframework.scheduling.quartz.SimpleThreadPoolTaskExecutor">
<property name="waitForJobsToCompleteOnShutdown" value="true"/>
<property name="threadCount" value="20"/>
<property name="threadNamePrefix" value="JmsConsumer"/>
</bean>
В качестве альтернативы, используя Spring Integration, просто создайте канал сообщений и несколько <jms:message-driven-channel-adapter/>
- по одному для каждой темы.Вот пример фрагмента:
<bean id="connectionFactory" class="..."/>
<int:channel id="allMessages"/>
<jms:message-driven-channel-adapter channel="allMessages" connection-factory="connectionFactory" destination-name="T.topic1"/>
<jms:message-driven-channel-adapter channel="allMessages" connection-factory="connectionFactory" destination-name="T.topic2"/>
<jms:message-driven-channel-adapter channel="allMessages" connection-factory="connectionFactory" destination-name="T.topic3"/>
<int:service-activator input-channel="allMessages" output-channel="results" ref="messageProcessingBean" method="onMessage"/>
За кулисами Spring Integration автоматически создаст MessageListenerContainer.
Еще одной альтернативой будет использование средств маршрутизации вашего JMS-провайдера / MOM длясоздать единый пункт назначения, куда направляются все соответствующие сообщения.Например, в RabbitMQ вы можете создать тему, которая привязана к нескольким обменам, и, следовательно, использовать только одно назначение AMQP.Однако это зависит от инфраструктуры и не будет возможно ни с одним поставщиком JMS.