Apache camel camel解包tar.gzip文件
使用camel over FTP下载几个文件后,我应该处理它们,但它们是tar.gzip格式的。Camel支持gzip,正如我看到的,从2.16.0开始,它还支持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
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();
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,你觉得这个解决方案怎么样?我指的是保留原始目录结构的部分。再次感谢您的评论。