2012-10-10 3 views
3

я использую сообщение слушателю контейнера с одного места и одного потребителя (сообщение слушателя):конфигурации 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" /> 

Если я хочу несколько пунктов назначения и для каждого назначения одного сообщения слушателя, какие я должен делать? И если мне нужен несколько слушателей для одного адресата, что мне делать?

+0

И любой предложения? – united

+0

'несколько пунктов назначения и для каждого получателя назначения просто, потому что у каждого слушателя есть ОДИН пункт назначения. 'несколько прослушивателей для одного пункта назначения' вы имеете в виду TOPIC? –

ответ

3

1) Вам необходимо определить каждого слушателя и продюсера сообщений в контексте весеннего приложения как фасоль. Что-то вроде этого:

<!-- 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) Затем вы можете установить соответствующие производители с помощью автоматического связывания или определяется в контексте приложения (смотрите ниже) класса, который будет обрабатывать сообщения. то есть класс, в котором компонент «Слушатель сообщений» ссылается выше:

<bean id="messageListener" class="com.stack.overflow.MessageHandler"> 
     <property name="publisher" ref="publisher-1" /> 
</bean> 

Это всего лишь 1-2-1 картографирование. Для любой другой маршрутизации вы можете добавить несколько издателей (например, выше), то вам решать, как вы реализуете требуемую логику маршрутизации, чтобы решить, какая тема/очереди должна опубликовать сообщение, полученное от потребителя 1 и т. Д. И т. Д.

+1

Спасибо за ваш ответ; Но я не могу это получить: как я могу иметь несколько MessageListener, зарегистрированных в ListenerContainer? Я новичок в JMS и HornetQ, расскажите, пожалуйста, более подробно. – united

+3

Зачем вам нужно зарегистрировать несколько прослушивателей сообщений? Если эти слушатели имеют разный тип, поведение вашего приложения будет непредсказуемым. Если они одного типа, почему бы просто не настроить параллельную настройку потребителя в контейнере? –

+0

Наверное, потому что он этого не знает. https://bsnyderblog.blogspot.com/2010/05/tuning-jms-message-consumption-in.html может помочь. Если вы используете аннотации, вы можете сделать так: @JmsListener (destination = "filter_mailbox", containerFactory = "myFactory", concurrency = "10-50") – ggb667

Смежные вопросы