2017-06-29 11 views
0

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つのヘッダーが表示されますCamelSplitCompleteCamelSplitSizeが正しく設定されていません。 CamelSplitCompleteが常にfalseの場合、CamelSplitSizeには値はありません。

このため、サイズに基づいて集計できません。私はeagerCheckCompletion()を使用して、アグリゲータルートで入力交換を取得しています。私のアグリゲータールートは以下のようになります。

from(AGGREGATOR_ENDPOINT).aggregate(new ZipAggregationStrategy()).constant(true) 
.eagerCheckCompletion().completionSize(header("CamelSplitSize"))to("file:///tmp/").end(); 

私はApache Documentationというこれらのヘッダーが常に設定されていると読んでいます。ここに何もないのですか?正しい方向のポインタは非常に役立ちます。

+0

スプリッターでストリーミングモードを使用している場合、「CamelSplitSize」はありません。しかし完成したものはそこにあるはずです。 –

+0

ありがとう@ClausIbsen! zipファイルの数を決定する方法はありますか? CamelSplitIndex - 1を使用してファイル数を調べることはできますか? –

+0

@ClausIbsen、それはドキュメントでも** Camel 2.9以降でこのストリームはストリームベースの分割で設定されていますが、完成したExchangeのみで設定されています** 2.12.5を使用しています –

答えて

0

私は全ルートを稼働させることができました。私は集約に必要ないくつかの不可欠なヘッダー(送信ファイル名とジップのファイル数)を設定するプリプロセッサの一種を追加しなければならなかった。

from(sftp://[email protected]/folder/path?password=password&delay=600000).to("file:///tmp/") 
.beanRef("headerProcessor").unmarshal(getZipFileDataFormat()) 
.split(body(Iterator.class)).streaming()  
.choice() 
    .when(header(Exchange.FILE_NAME).contains(".json")) 
    .to(JSON_ENDPOINT).endChoice() 
    .otherwise() 
    .to(AGGREGATOR_ENDPOINT) 
.endChoice() 
.end(); 

その後、ジップ凝集戦略は期待どおりに機能しました。回答の完了のためだけに集約ルートを置く。

from(AGGREGATOR_ENDPOINT) 
    .aggregate(header(MyConstants.HEADER_OUTGOING_FILE_NAME), new ZipAggregationStrategy()) 
    .eagerCheckCompletion().completionSize(header(MyConstants.HEADER_TOTAL_FILE_COUNT)) 
    .setHeader(Exchange.FILE_NAME, simple("${header.outgoingFileName}")) 
.to("file:///tmp/").end(); 
関連する問題