通过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:
感谢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()检查。
答案 0 :(得分:3)
您可以使用camel-tarfile
组件。
如果你的tar.gz包含多个文件,你应该ungzip,然后解压并拆分每个文件的交换。 TarSplitter
是一个表达式,它将tar分解为tar中包含的每个文件的迭代器。
from("file:target/from")
.unmarshal().gzip()
.split(new TarSplitter())
.to("file:target/to");