Конфигурация Spring для нескольких направлений и потребителей
Я использую контейнер слушателя сообщений с одним получателем и одним получателем (слушателем сообщения):
<bean id="msgListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"
p:connectionFactory-ref="connectionFactory"
p:destination-ref="destination"
p:messageListener-ref="messageHandler"
p:concurrentConsumers="10"
p:maxConcurrentConsumers="50"
p:receiveTimeout="5000"
p:idleTaskExecutionLimit="10"
p:idleConsumerLimit="5" />
Что мне делать, если мне нужно несколько адресатов и для каждого адресата один прослушиватель сообщений? И если я хочу несколько слушателей для одного места назначения, что мне делать?
1 ответ
1) Вы должны определить каждый приемник сообщений и производителя в контексте приложения Spring как bean-компоненты. Что-то вроде этого:
<!-- MESSAGE LISTENER CONTAINER -->
<bean id="ListListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="messageListener" ref="messageListener" />
<property name="connectionFactory" ref="qcf" />
<property name="destinationResolver" ref="JmsDestinationResolver" />
<property name="receiveTimeout" value="${jms-timeout}" />
<property name="destinationName" value="${jms-list-topic}" />
<property name="concurrency" value="1" />
<property name="pubSubDomain" value="true" />
<property name="subscriptionDurable" value="${jms-durable-flag}"/>
<property name="durableSubscriptionName" value="${jms-list-durable-name}" />
<property name="clientId" value="${jms-list-client-id}"/>
<property name="sessionTransacted" value="true"/>
</bean>
<bean id="publisher-1" class="com.stack.overflow.JmsPublisherImpl">
<constructor-arg ref="jmsTemplate" />
</bean>
2) Затем вы можете установить соответствующих производителей, используя Autowiring или определенный в контексте приложения (см. Ниже) для класса, который будет обрабатывать сообщение. то есть класс, на который ссылается bean-компонент Message Listener выше:
<bean id="messageListener" class="com.stack.overflow.MessageHandler">
<property name="publisher" ref="publisher-1" />
</bean>
Это всего лишь 1-2-1 сопоставления. Для любой другой маршрутизации вы можете добавить более одного издателя (как описано выше), тогда вам решать, как реализовать необходимую логику маршрутизации, чтобы решить, в какой теме / очередях следует публиковать сообщение, полученное от потребителя 1 и т. Д. И т. Д.