Apache camel camel解包tar.gzip文件

Apache camel camel解包tar.gzip文件,apache-camel,gzip,tar,Apache Camel,Gzip,Tar,使用camel over FTP下载几个文件后,我应该处理它们,但它们是tar.gzip格式的。Camel支持gzip,正如我看到的,从2.16.0开始,它还支持tar端点() 我提取gzip的代码: from("file:modelFiles?readLock=changed&recursive=true&consumer.delay=1000") .unmarshal(new ZipFileDataFormat()) .choic

使用camel over FTP下载几个文件后,我应该处理它们,但它们是tar.gzip格式的。Camel支持gzip,正如我看到的,从2.16.0开始,它还支持tar端点()

我提取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存档打开

问题:

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();
  • 我应该如何打开gzip档案
  • 我怎么能为你做同样的事呢 焦油档案
  • 更新1:

    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();
    
    谢谢你的来信,杰里米。我按照建议更改了代码如下:

                    from("file:modelFilesSBML2?readLock=changed&recursive=true&consumer.delay=1000")
                        .unmarshal().gzip()
                        .split(new TarSplitter())
                        .to("file:modelFilesSBML_unzipped");
    
    然后我收到以下异常(仅供参考,tar.gzip文件不是零长度):失败异常:无法将空正文写入文件:modelFilesSBML_unzip\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
    
    解决方案:

    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();
    
    在尝试了许多方法之后,我最终使用了它,如下所示(对于Camel 2.17.0它在2.16.0或2.16.1中不起作用):

    使用Camel 2.17.0,您还可以跳过body().isNotNull()检查。


    杰里米的建议帮助很大,所以我会接受他的回答作为解决办法。尽管如此,如果我不检查消息体是否为null,异常仍然会出现。文件名=${in.header.CamelFileRelativePath}{file:name}也保留了原始文件结构,其中文件名的前缀是file.tar.gz,但我没有找到任何其他方法来保留目录结构,因为文件端点不接受中目录的表达式(“file:directory?options…”).

    您可以使用
    文件组件

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

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

    您可以使用
    camel文件
    组件

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

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

    谢谢Jeremie,我试过了,但是一个异常抱怨空体。这类似于我在原始代码中添加了一个空主体检查的原始异常,但随后所有内容都被省略了。我不知道。我已经在我的机器上用几个tar.gz测试了我答案中的代码,它在没有空检查的情况下工作。Jeremie,你觉得这个解决方案怎么样?我指的是保留原始目录结构的部分。再次感谢您的评论。谢谢Jeremie,我试过了,但是一个异常抱怨空主体。这类似于我在原始代码中添加了一个空主体检查的原始异常,但随后所有内容都被省略了。我不知道。我已经在我的机器上用几个tar.gz测试了我答案中的代码,它在没有空检查的情况下工作。Jeremie,你觉得这个解决方案怎么样?我指的是保留原始目录结构的部分。再次感谢您的评论。