2017-01-18 6 views
0

私はActiveMQとの春の統合を使用しています。私はmaxConcurrentConsumers = 5のDefaultMessageListenerContainerを定義しました。 int-xml:validating-filterとint-xml:unmarshalling-transformerの後で、私はキューチャネルactionInstructionTransformedを定義しました。そして、私はこのキューチャネルのポーラーを持っています。アプリケーションを起動すると、ActiveMQコンソールで、接続が作成され、5つのセッション内にあることがわかります。春の統合複数のコンシューマが同時に処理しない

今、私はメソッドの入り口でログ文を持っている

@ServiceActivator(inputChannel = "actionInstructionTransformed", poller = @Poller(value = "customPoller")). 

アノテーション付きメソッドと@MessageEndpointを持っています。各メッセージの処理は長い(数分)。私のログでは、thread-1が処理を開始してから、thread-1の出力しか見ることができません。 thread-1が1メッセージの処理を終了した場合にのみ、thread-2が次のメッセージの処理を開始することがわかります。クラス内に同期ブロックがありません。@MessageEndpointの注釈付きです。私はthread-1thread-2などのメッセージを同時に処理することはできませんでした。

誰かが似たような経験をしていますか?

答えて

0

ルックは、あなたが言う:INT-xmlの後

:検証し、フィルタとINT-XML:非整列化-トランス、私はキューチャネルactionInstructionTransformedを定義しました。

次に、QueueChannelPollingConsumerdefinitionsに行ってみましょう。一方

は、org.springframework.messaging.PollableChannelインタフェース(例えばQueueChannel)を実装し、チャネルに接続されたチャネルアダプタはPollingConsumerのインスタンスを生成します。

@PollerPollerMetadataが)taskExecutorオプションを持っていることに注意を払います。

デフォルトでは、TaskScedhulerは、QueueChannelに、triggerの設定に従って定期的にデータを要求します。それがfixedRate = falseのようなデフォルトオプションを持つPeriodicTriggerの場合、次のポーリングは実際には前のポーリング後に行われます。そのため、スレッドは1つしか表示されません。

したがって、taskExecutorを設定しようとすると、そのキューからのメッセージは並行して送られます。

DefaultMessageListenerContainerconcurrencyは効果がありません。最終的には、すべてのメッセージをQueueChannelに送信します。そしてここで、新しいスレッドモデルが@Poller構成に基づいて動作し始めます。

+0

ありがとうございました。私はint:poller定義と 私は現在5つのスレッドを同時に処理しています。 –

関連する問題