5

topATopic をリッスンする 5 つのスレッドのプールを達成することを目標に、JMS サブスクライバー リスナーを次のように設定していますが、実行時に複数のコンシューマーが同じレコードを処理していることがわかります (recordCount*コンシューマーの数)。

私は春が初めてなので、何か間違ったことをしていると思います。

<bean id="messageListener" class="com.abc.app.mdp.Receiver">
<property name="bean" ref="bean" />
</bean>

<jms:listener-container container-type="default"
connection-factory="connectionFactory" acknowledge="auto" concurrency="5" destination-type="topic" prefetch="1" cache="none" >
<jms:listener destination="topCli_Service" ref="messageListener" 
method="onMessage" subscription="AProjectSubscriber" />
</jms:listener-container>

<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryB ean">
<property name="jndiName" value="jms/jms-top-notx" />
</bean>

誰かが私の目標を達成する方向に私を向けることができますか?

4

2 に答える 2

12

リスナーコンテナ構成の同時実行設定を確認してください。Spring JMSのドキュメントでは、トピックリスナーの同時実行性を1に設定する必要があると提案されています。下記参照。

同時実行性:リスナーごとに開始する同時セッション/コンシューマーの数。最大数を示す単純な数値(「5」など)、または下限と上限を示す範囲(「3-5」など)のいずれかです。指定された最小値は単なるヒントであり、実行時に無視される可能性があることに注意してください。デフォルトは1です。トピックリスナーの場合、またはキューの順序が重要な場合は、同時実行を1に制限してください。一般的なキューのためにそれを上げることを検討してください。

この投稿は、残りの質問と似ています。

メッセージの量に対応するために複数のスレッドが必要な場合、メッセージリスナーはSpring TaskExecutorに委任して、メッセージを非同期的に処理できます。TaskExecutorsは、スレッドプールを含む多くの実装によってサポートされます。

于 2011-04-27T18:32:39.840 に答える
2

特定のメッセージを 1 つのコンシューマーのみが消費するようにする場合は、トピックの代わりにキューを使用する必要があります。トピック メッセージは、利用可能なすべてのコンシューマにブロードキャストされます。

于 2011-04-27T16:49:29.630 に答える