2011-12-22 9 views
1

複数の宛先トピックを解決するためにDefaultMessageListenerContainerを設定する必要があります。私は複数のコンテナを設置したくないので、これをどう設定するか、それが可能なのかどうか疑問に思っていました。あなたがまっすぐ春のJMSを使用して複数のトピックからのメッセージを聞くことを希望する場合春の統合 - 複数の宛先を解決するためにDefaultMessageListenerContainerを設定する

おかげ

答えて

3

は、あなたは、このクラスの複数のインスタンスを作成する必要があります。唯一の問題は、デフォルトでそれぞれ独自のTaskExecutorを作成することです。これは少し無駄です。これを回避するには、コンテキスト内で独自のtaskExecutor beanを定義するだけで、すべてのメッセージリスナーが自動的にそれを使用します。

スタンドアロンVMでうまく動作するタスクエグゼキュータは、異なるコンテナのネイティブワークマネージャ/スレッドプール機能と統合する代替実装があります。各トピックに対して1つの -

<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> 

あるいは、春の統合を使用して、単にメッセージ・チャネルと複数<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"/> 

は、春の統合は自動的にMessageListenerContainerを作成します。

さらに、JMSプロバイダ/ MOMのルーティング機能を使用して、関連するすべてのメッセージがルーティングされる単一の宛先を作成することもできます。例えば。 RabbitMQでは、複数のエクスチェンジにバインドされているトピックを作成することができるため、消費するAMQP宛先は1つだけです。ただし、これはインフラストラクチャに依存しており、任意のJMSプロバイダでは不可能です。