Интеграция Spring - настройка DefaultMessageListenerContainer для разрешения нескольких назначений - PullRequest
2 голосов
/ 22 декабря 2011

У меня есть требование настроить DefaultMessageListenerContainer для разрешения нескольких тем назначения.Я не хочу создавать несколько контейнеров, и мне было интересно, как это настроить или даже если это возможно.

Спасибо

1 Ответ

4 голосов
/ 27 декабря 2011

Если вы хотите прослушивать сообщения из нескольких тем с использованием прямой 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...