FTPサーバーからzipファイルをポーリングする単純なルートがあります。 zipファイルは、処理が必要なファイルと0個以上の添付ファイルで構成されています。 私は分割のためにZipFileDataFormatを使用しようとしています。私はアイテムを分割して、必要に応じてルーティングすることができます。つまり、処理ファイルをプロセッサとその他のファイルに送ります。Camel ZipFileDataFormatストリーミング時に分割がヘッダーを設定しない
ルートは以下のようになります。
from(sftp://[email protected]/folder/path?password=password&delay=600000)
.unmarshal(getZipFileDataFormat()).split(body(Iterator.class)).streaming()
.log("CamelSplitComplete :: ${header.CamelSplitComplete}")
.log("Split Size :: ${header.CamelSplitSize}")
.choice()
.when(header(MyConstants.CAMEL_FILE_NAME_HEADER).contains(".json"))
.to(JSON_ENDPOINT).endChoice()
.otherwise()
.to(AGGREGATOR_ENDPOINT)
.endChoice()
.end();
getZipFileDataFormat
private ZipFileDataFormat getZipFileDataFormat() {
ZipFileDataFormat zipFile = new ZipFileDataFormat();
zipFile.setUsingIterator(true);
return zipFile;
}
分割が正常に動作します。ただし、ログに2つのヘッダーが表示されますCamelSplitCompleteとCamelSplitSizeが正しく設定されていません。 CamelSplitCompleteが常にfalseの場合、CamelSplitSizeには値はありません。
このため、サイズに基づいて集計できません。私はeagerCheckCompletion()を使用して、アグリゲータルートで入力交換を取得しています。私のアグリゲータールートは以下のようになります。
from(AGGREGATOR_ENDPOINT).aggregate(new ZipAggregationStrategy()).constant(true)
.eagerCheckCompletion().completionSize(header("CamelSplitSize"))to("file:///tmp/").end();
私はApache Documentationというこれらのヘッダーが常に設定されていると読んでいます。ここに何もないのですか?正しい方向のポインタは非常に役立ちます。
スプリッターでストリーミングモードを使用している場合、「CamelSplitSize」はありません。しかし完成したものはそこにあるはずです。 –
ありがとう@ClausIbsen! zipファイルの数を決定する方法はありますか? CamelSplitIndex - 1を使用してファイル数を調べることはできますか? –
@ClausIbsen、それはドキュメントでも** Camel 2.9以降でこのストリームはストリームベースの分割で設定されていますが、完成したExchangeのみで設定されています** 2.12.5を使用しています –