我有一个简单的路由,可以从FTP服务器轮询zip文件。 zip文件由一个需要处理的文件和零个或多个附件组成。 我正在尝试使用ZipFileDataFormat进行拆分,并且我能够根据需要拆分和路由项目,即将处理文件发送到处理器,将其他文件发送到聚合器端点。
路线如下所示:
from(sftp://username@server/folder/path?password=password&delay=600000)
.unmarshal(getZipFileDataFormat()).split(body(Iterator.class)).streaming()
.log("CamelSplitComplete :: ${header.CamelSplitComplete}")
.log("Split Size :: ${header.CamelSplitSize}")
.choice()
.when(header(MyConstants.CAMEL_FILE_NAME_HEADER).contains(".json"))
.to(JSON_ENDPOINT).endChoice()
.otherwise()
.to(AGGREGATOR_ENDPOINT)
.endChoice()
.end();
getZipFileDataFormat
private ZipFileDataFormat getZipFileDataFormat() {
ZipFileDataFormat zipFile = new ZipFileDataFormat();
zipFile.setUsingIterator(true);
return zipFile;
}
分裂工作正常。但是,我可以在日志中看到未正确设置两个标题 CamelSplitComplete 和 CamelSplitSize 。 CamelSplitComplete始终为false,CamelSplitSize没有任何值。
因此,我无法根据大小进行聚合。我正在使用 eagerCheckCompletion()来获取聚合器路由中的输入交换。我的聚合器路线如下所示。
from(AGGREGATOR_ENDPOINT).aggregate(new ZipAggregationStrategy()).constant(true)
.eagerCheckCompletion().completionSize(header("CamelSplitSize"))to("file:///tmp/").end();
我看了Apache Documentation这些标题总是被设置的。我在这里错过了什么吗?任何指向正确方向的指针都会非常有用。
答案 0 :(得分:0)
我能够让整条路线发挥作用。我不得不添加一种预处理器,它会设置一些我需要聚合的基本标题(输出文件名和zip的文件数)。
from(sftp://username@server/folder/path?password=password&delay=600000).to("file:///tmp/")
.beanRef("headerProcessor").unmarshal(getZipFileDataFormat())
.split(body(Iterator.class)).streaming()
.choice()
.when(header(Exchange.FILE_NAME).contains(".json"))
.to(JSON_ENDPOINT).endChoice()
.otherwise()
.to(AGGREGATOR_ENDPOINT)
.endChoice()
.end();
之后,zip聚合策略按预期工作。在这里放置聚合路线只是为了完成答案。
from(AGGREGATOR_ENDPOINT)
.aggregate(header(MyConstants.HEADER_OUTGOING_FILE_NAME), new ZipAggregationStrategy())
.eagerCheckCompletion().completionSize(header(MyConstants.HEADER_TOTAL_FILE_COUNT))
.setHeader(Exchange.FILE_NAME, simple("${header.outgoingFileName}"))
.to("file:///tmp/").end();