camel unpacking tar.gzip files

时间:2016-03-20 15:26:16

标签: apache-camel gzip tar

通过FTP下载几个带camel的文件后,我应该处理它们,但它们是tar.gzip格式。 Camel支持gzip,从2.16.0开始我也可以看到tar端点(http://camel.apache.org/camel-2160-release.html)。

我提取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文件?
  3. 更新1:

    感谢Jeremie的职位。我改变了这样的代码:

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

    然后我收到以下异常(仅用于tar.gzip文件长度不为零的信息): FailedException:无法将null body写入文件: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
    

    解决方案:

    在尝试了很多方法后,我最终使用它如下( Camel 2.17.0 它不适用于2.16.0或2.16.1):

    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();
    

    使用Camel 2.17.0,你也可以跳过body()。isNotNull()检查。

    Jeremie的建议很有帮助,所以我会接受他的回答作为解决方案。然而,如果我没有检查消息体是否为null,那么异常仍然会出现。 fileName = $ {in.header.CamelFileRelativePath} _ $ {file:name} 还保留原始文件结构,其中文件名以file.tar.gz作为前缀,但我还没有找到任何文件结构保留目录结构的其他方法,因为文件端点不接受(" file:directory?options ...")中目录的表达式。

1 个答案:

答案 0 :(得分:3)

您可以使用camel-tarfile组件。

如果你的tar.gz包含多个文件,你应该ungzip,然后解压并拆分每个文件的交换。 TarSplitter是一个表达式,它将tar分解为tar中包含的每个文件的迭代器。

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