2016-07-17 8 views
0

私は以下のようなルートを持っています。ルートは定期的にディレクトリをポーリングし、大きなサイズの.csvファイルを読み込みます。その後、ファイルを1000行のチャンクに分割し、seda queue(firstQueue)に送信します。私はこのsedaキューに15人の同時消費者を持っています。Apache camelのSedaの同時消費者

route.split().tokenize("\n", 1000).streaming().to("seda:firstQueue?concurrentConsumers=15").process(myProcessor).to("seda:secondQueue?concurrentConsumers=15").process(anotherMyProcessor); 

1)意味15人の同時消費者の何 - それは15件のスレッドがSEDAからデータを読み込み、myProcessorの1つのインスタンスに渡し意味ありませんの?または、myProcessorの15の別個のインスタンスが、それぞれデータの同じコピー上で動作するように作成されますか? myProcessorはシングルトンであることに注意してください。プロトタイプに変更するとどうなりますか?

2)2つ以上のスレッドが同じデータを選択してmyProcessorに渡すことは可能ですか?または、2つのスレッドが同じデータを持たないことが保証されていますか?

迅速な対応を心より感謝します。ありがとう!

+0

かなり古いバージョンのcamel - 2.10.1を使用しています。このバージョンではsedaとconcurrentConsumersに問題があったのか誰にも気付いていますが、それ以降のバージョンで修正されている可能性はありますか? –

答えて

1

マイキャメルは少し錆びですが、私は

  1. が実行されている15件のスレッドがあることを確信しています。それぞれは、キューからメッセージを読み取り、myProcessorを呼び出します。私のプロセッサのインスタンスは1つしかないので、スレッドセーフであることを確認する必要があります。私はそれを試したことはありませんが、私はプロトタイプの範囲を変更することは何か違いがあるとは思わない。

  2. 2つのスレッドが同じメッセージをキューから取得してはなりません。通常の動作では、各メッセージは1回だけ処理されます。しかし、同じメッセージが2回処理されるという結果が出るというエラー条件があります。もっとも明白なのは、ファイルを処理してアプリケーションを部分的に再起動することです。

+0

返信のためにMattさんに感謝します。したがって、SEDAは基本的に「BlockingQueue」なので、2つのスレッドが同じメッセージのコピーを持たないことが保証されていますか?また、スレッドがキューからメッセージをピックアップすると、そのメッセージはすぐにキューから削除されます。 –

+1

はい、ブロックキューはまさにそれです。スレッドがメッセージを取得すると、そのメッセージはすぐにキューから削除されるので、他のスレッドは同じメッセージを受け取ることはありません。 –

+0

私は15のconcurrentConsumerが定義されているにもかかわらず、もう1つの質問は、(myProcessorによる)メッセージを処理するスレッドが1つしかないことがわかります。なぜこれが起こっているのか? –

関連する問題