2

複数の宛先トピックを解決するには、DefaultMessageListenerContainer を構成する必要があります。複数のコンテナーをインスタンス化したくないので、これを構成する方法や、それが可能かどうかさえ疑問に思っていました。

ありがとう

4

1 に答える 1

4

直接の 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 プロバイダーでは不可能です。

于 2011-12-27T13:30:28.077 に答える