Apache camel Camel-ZipFileDataFormat分割不';流媒体时不要设置标题

Apache camel Camel-ZipFileDataFormat分割不';流媒体时不要设置标题,apache-camel,splitter,camel-zipfile,Apache Camel,Splitter,Camel Zipfile,我有一个从FTP服务器轮询zip文件的简单路由。zip文件由一个需要处理的文件和零个或多个附件组成。 我正在尝试使用ZipFileDataFormat进行拆分,并且我能够根据需要拆分和路由项目,即将处理文件发送到处理器,将其他文件发送到聚合器端点 路线如下所示: from(sftp://username@server/folder/path?password=password&delay=600000) .unmarshal(getZipFileDataFormat()).split(b

我有一个从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

拆分工作正常。但是,我可以在日志中看到,两个标题CamelSplitCompleteCamelSplitSize设置不正确。如果CamelSplitComplete始终为false,则CamelSplitSize没有任何值

因此,我无法根据大小进行聚合。我正在使用eangercheckcompletion()获取聚合器路由中的输入交换。我的聚合器路径如下所示

from(AGGREGATOR_ENDPOINT).aggregate(new ZipAggregationStrategy()).constant(true)
.eagerCheckCompletion().completionSize(header("CamelSplitSize"))to("file:///tmp/").end();

我读到这些标题总是设置好的。我有什么遗漏吗?任何指向正确方向的指针都会非常有帮助。

我能够完成整个路线。我必须添加一种预处理器,它将设置聚合所需的一些基本头(传出文件名和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();

我能够全程上班。我必须添加一种预处理器,它将设置聚合所需的一些基本头(传出文件名和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();

如文件所述,在拆分器上使用流模式时,没有
camelspitsize
。但是,完成的文件应该在那里。谢谢@ClausIbsen!有没有办法确定zip中的文件数?我们可以使用camelspiltendex-1来确定文件的数量吗?@ClausIbsen,它还在文档中说,从camel2.9开始,这个头也在基于流的拆分中设置,但仅在完成的交换上设置。我正在使用2.12.5Try和更新的版本,因为2.12.x非常旧。我手动设置相关和完成大小的标题。现在,我在聚合器路径中获得了正确的值。但是,现在没有生成zip文件。交换过程中没有任何错误。聚合器路由现在如下所示<代码>来自(聚合器_端点).log(“聚合文件计数:${header.totalFileCount}”).log(“传入文件名:${header.incomingFileName}”).aggregate(header(“incomingFileName”),new ZipAggregationStrategy()).completionSize(header(“totalFileCount”).to(“file:///tmp/)结束()关于为什么没有生成zip文件的任何指针?当您在拆分器上使用流模式时,没有
camelspitsize
。但是,完成的文件应该在那里。谢谢@ClausIbsen!有没有办法确定zip中的文件数?我们可以使用camelspiltendex-1来确定文件的数量吗?@ClausIbsen,它还在文档中说,从camel2.9开始,这个头也在基于流的拆分中设置,但仅在完成的交换上设置。我正在使用2.12.5Try和更新的版本,因为2.12.x非常旧。我手动设置相关和完成大小的标题。现在,我在聚合器路径中获得了正确的值。但是,现在没有生成zip文件。交换过程中没有任何错误。聚合器路由现在如下所示<代码>来自(聚合器_端点).log(“聚合文件计数:${header.totalFileCount}”).log(“传入文件名:${header.incomingFileName}”).aggregate(header(“incomingFileName”),new ZipAggregationStrategy()).completionSize(header(“totalFileCount”).to(“file:///tmp/)结束()有没有关于为什么没有生成zip文件的指针?卡比拉,我正在尝试实现一些非常类似的东西。但是,生成的输出zip中的每个文件都有交换ID,而不是文件名。我使用的是XMLDSL,所以要设置文件名,我使用${header.CamelFileName}。这是在调用聚合器之前完成的,编辑header.CamelFileName,以便使用该header的值命名输出zip。但是,内部文件是用它们的交换id命名的。有什么想法吗?卡比拉,我正在尝试实现一些非常类似的功能。但是,生成的输出zip中的每个文件都有交换ID,而不是文件名。我使用的是XMLDSL,所以要设置文件名,我使用${header.CamelFileName}。这是在调用聚合器之前完成的,编辑header.CamelFileName,以便使用该header的值命名输出zip。但是,内部文件是用它们的exchange id命名的。知道吗?