2016-03-20 9 views
0

camel over FTPで複数のファイルをダウンロードした後、それらを処理する必要がありますが、tar.gzip形式です。 Camelはgzipをサポートしています。2.16.0以降のtarエンドポイントも見ることができます(http://camel.apache.org/camel-2160-release.html)。camel unpacking tar.gzip files

gzipの抽出のための私が持っているコード:

from("file:modelFiles?readLock=changed&recursive=true&consumer.delay=1000") 
     .unmarshal(new ZipFileDataFormat()) 
       .choice() 
        .when(body().isNotNull()) 
         .log("Uziping file ${file:name}.") 
         .to("file:modelFiles_unzipped") 
        .endChoice() 
     .end(); 

すべてのファイルは、ルールを介して実行しかし、彼らは再び.tar.gzファイルとして作成されますが、悪化したコンテンツも破損していることであるが、彼らはgzipアーカイブとして後でオープンすることさえできません。

質問:

  1. がどのように私はgzipでアーカイブを解凍する必要がありますか?
  2. のtarファイルでどうすればいいですか?

アップデート1:ポストジェレミーため

感謝。提案されたように私はこのようなコードを変更:

   from("file:modelFilesSBML2?readLock=changed&recursive=true&consumer.delay=1000") 
        .unmarshal().gzip() 
        .split(new TarSplitter()) 
        .to("file:modelFilesSBML_unzipped"); 

その後、私は次の例外(だけの情報のためのtar.gzipファイルは、長さがゼロではない)受信:FailedException:ファイルにヌル体を書き込むことができません:modelFilesSBML_unzippedを\ 2006-01-31 \ BioModels_Database-R4-sbml_files.tar.gz

2016-03-22 14:11:47,950 [ERROR|org.apache.camel.processor.DefaultErrorHandler|MarkerIgnoringBase] Failed delivery for (MessageId: ID-JOY-49807-1458652278822-0-592 on ExchangeId: ID-JOY-49807-1458652278822-0-591). Exhausted after delivery attempt: 1 caught: org.apache.camel.component.file.GenericFileOperationFailedException: Cannot write null body to file: modelFilesSBML_unzipped\2006-01-31\BioModels_Database-r4-sbml_files.tar.gz 

ソリューション:

多くの方法を試した後、次のように、私は最終的にそれを使用しています(それは2.16.0または2.16.1では動作しませんでしたキャメル2.17.0 で):キャメル2.17.0で

from("file:modelFilesSBML?noop=true&recursive=true&consumer.delay=1000") 
    .unmarshal().gzip() 
    .split(new TarSplitter()) 
    .to("log:tar.gzip?level=INFO&showHeaders=true") 
      .choice() 
       .when(body().isNotNull()) 
        .log("### Extracting file: ${file:name}.") 
        .to("file:modelFilesSBML_unzipped?fileName=${in.header.CamelFileRelativePath}_${file:name}")  
      .endChoice()         
    .end(); 

あなたも身体()isNotNull()チェックをスキップすることができます。

ジェレミーの提案は多くの助けになるので、解決策として彼の答えを受け入れることにします。それにもかかわらず、メッセージボディにヌルがないかどうかチェックしなければ、例外が発生します。 fileName = $ {in.header.CamelFileRelativePath} _ $ {file:name}は、ファイル名の先頭にfile.tar.gzが付いている元のファイル構造も保持していますが、他の方法でファイルを保存することはできませんファイルのエンドポイントは( "file:directory?options ..."の)ディレクトリの式を受け入れません。

答えて

3

camel-tarfileコンポーネントを使用できます。

tar.gzに複数のファイルが含まれている場合、各ファイルの交換を解凍してから展開して分割する必要があります。 TarSplitterは、tarをtarに含まれる各ファイルのイテレータに分割する式です。

from("file:target/from") 
    .unmarshal().gzip() 
    .split(new TarSplitter()) 
    .to("file:target/to"); 
+0

ありがとうございましたJeremie、私はそれを試しましたが、例外はnullボディについて不平を言います。これは元のコードにヌルボディチェックを追加したものの、すべてが省略されている元の例外と似ています。 – Tamas

+0

私は分かりません。私は自分のマシン上でseverals tar.gzで私の答えのコードをテストしました。それはヌルチェックなしで動作していました。 –

+0

Jeremie、ソリューションについてどう思いますか?私は元のディレクトリ構造を維持するための部分を意味します。ご意見ありがとうございました。 – Tamas