ストリーム コンポーネント は、ファイルの各行に対して新しい交換を作成します。
ストリーム コンポーネントは、XX 行 (デフォルトでは 0) で分割するオプションを提供します。
groupLines 0 Camel 2.5: コンシューマーで X 行のグループ化。たとえば、10 行をグループ化して、行ごとに 1 つの Exchange ではなく、10 行の Exchange のみを吐き出すには。
このオプションは、XX 行の新しい交換を作成するために使用されます。StreamConsumerの関連コードは次のとおりです。
if (lines.size() >= endpoint.getGroupLines()) {
// spit out lines
Exchange exchange = endpoint.createExchange();
// create message with the lines
Message msg = new DefaultMessage();
List<String> copy = new ArrayList<String>(lines);
msg.setBody(endpoint.getGroupStrategy().groupLines(copy));
exchange.setIn(msg);
// clear lines
lines.clear();
getProcessor().process(exchange);
}
そして、交換が完了するたびに onCompletion が実行されます。
camel doc から ( onCompletion documentation ):
常に、成功して完了した場合のみ、または失敗した場合にのみトリガーされます
したがって、最初の行が読み取られた後、コードはルートを停止します。
明らかに、ストリーム コンポーネントでファイルの終わりがいつ発生するかを知る方法は実際にはありません。
良い方法は、スプリッターのように CamelSplitComplete プロパティを持つことです。そのように使用できます ( onCompletion with onWhen 述語の章を参照):
onCompletion()
.onWhen(property("CamelSplitComplete").isEqualTo("true"))
.setBody(simple("")).bean(new Stop(getContext(), transferID));
編集:ストリーム コンシューマーのみを探していましたが、プロデューサーも使用しているためです。closeOnDone プロパティを見てください。うまくいくかもしれません。
closeOnDone | 偽 | Camel 2.11.0: このオプションは、Splitter および同じファイルへのストリーミングと組み合わせて使用されます。アイデアは、パフォーマンスを向上させるために、ストリームを開いたままにし、スプリッターが完了したときにのみ閉じることです。これには、2 つ以上のファイルではなく、同じファイルにのみストリーミングする必要があることに注意してください。