Camel ZipFileDataFormat拆分在流式传输时不设置标头

时间:2017-06-29 15:38:22

标签: apache-camel splitter camel-zipfile

我有一个简单的路由,可以从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这些标题总是被设置的。我在这里错过了什么吗?任何指向正确方向的指针都会非常有用。

1 个答案:

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