複数の宛先トピックを解決するには、DefaultMessageListenerContainer を構成する必要があります。複数のコンテナーをインスタンス化したくないので、これを構成する方法や、それが可能かどうかさえ疑問に思っていました。
ありがとう
複数の宛先トピックを解決するには、DefaultMessageListenerContainer を構成する必要があります。複数のコンテナーをインスタンス化したくないので、これを構成する方法や、それが可能かどうかさえ疑問に思っていました。
ありがとう
直接の Spring JMS を使用して複数のトピックからのメッセージをリッスンする場合は、このクラスの複数のインスタンスを作成する必要があります。唯一の問題は、デフォルトでそれぞれが独自の TaskExecutor を作成することで、これは少し無駄です。これを回避するtaskExecutor
には、コンテキストで独自の Bean を定義するだけで、すべてのメッセージ リスナーが自動的にそれを使用します。
これは、スタンドアロン VM で適切に機能するタスク エグゼキュータです。さまざまなコンテナのネイティブ ワーク マネージャ / スレッド プール機能と統合する代替実装があります。
<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/>
の を作成します (トピックごとに 1 つ)。サンプル スニペットを次に示します。
<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 宛先は 1 つだけです。ただし、これはインフラストラクチャに依存し、特定の JMS プロバイダーでは不可能です。