3

1 つの宛先と 1 つのコンシューマー (メッセージ リスナー) を持つメッセージ リスナー コンテナーを使用しています。

<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 つの宛先に対して複数のリスナーが必要な場合は、どうすればよいですか?

4

1 に答える 1

3

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 を使用するか、メッセージを処理するクラスでアプリ コンテキスト (以下を参照) で定義された関連プロデューサーを設定できます。つまり、上記の Message Listener Bean ref が指すクラス:

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

これは単なる 1-2-1 マッピングです。他のルーティングでは、複数のパブリッシャーを追加できます (上記のように)。必要なルーティング ロジックを実装して、コンシューマー 1 などから受信したメッセージをパブリッシュするトピック/キューを決定する方法はユーザー次第です。

于 2012-10-10T15:42:35.520 に答える