2016-06-23 2 views
0

複数のconcurrentConsumersを持つDefaultMessageListenerContainerについて質問がありますが、コンテナはコンシューマごとに異なるセッションを作成しますが、私の問題はコンテナがすべてのコンシューマ間で1つのメッセージリスナーインスタンスしか共有できないことです各スレッドがリスナーが使用可能になるのを待つため、並行して処理します。各コンシューマに、メッセージを処理するためのメッセージリスナーの排他的インスタンスを持たせることはできません。DefaultMessageListenerContainer concurrentConsumers

答えて

1

コンテナは、スレッドセーフ(ステートレス)リスナー、つまり保護されていないグローバル状態で使用するように設計されています。

状態を保護するために​​を使用するように聞こえます。これにより、一度に1つのリスナースレッドしか許可されません。

リスナーBeanをスレッドセーフにすることができない場合は、複数のコンテナを使用する必要があります。それぞれ異なるリスナーBean(プロトタイプスコープを使用できるため、コンテナごとに独自のBeanを取得できます)を使用する必要があります。

+0

説明ありがとう、ありがとう、私はデザインを理解しています。 私は4つの並行コンシューマがある場合、唯一のインスタンス**(1つのDMLCで使用される場合はシングルトン)**がスレッド間で共有され、1つのスレッドがそのコードを実行するリスナークラス)は、独自の実行スタックにラップされている間に別のスレッドが待機していても、同期化されていなくても、このリスナーを並列実行するマルチコア/プロセッサの利益を得ることはできません。 特に、私は各メッセージのために実行する長いビジネスがある場合。 –

+0

いいえ、オブジェクトがステートレスで、 'synchronized'ブロックを持たない限り(特に、リスナーメソッドは' synchronized'としてマークされていません)、スレッドはリスナーコードを同時に実行します。 –

+0

この場合はありがとうございます。 –

関連する問題