我创建了一条路线
问题:如何根据聚合器生成的数组数量打印多个文件?
from("file:C:\\Users\\Desktop?fileName=books.xml&noop=true")
.split(xpath("/books/book"))
.process(new MyProcessor())
.setHeader("category", xpath("/book/@category").stringResult())
.aggregate(header("category"), new SetAggregationStrategy()).completionTimeout(500)
.process(new MyProcessor())
.convertBodyTo(String.class)
.to("file:C:\\Users\\Desktop\\New")
.end();
Run Code Online (Sandbox Code Playgroud)
我认为你只是用每个新的聚合覆盖同一个文件。为了避免这种情况,您必须为每个聚合提供另一个(动态)文件名来将其写入。
例如,将 [categoryname].xml 设置为您可以使用的每个聚合的文件名
.setHeader(Exchange.FILE_NAME, simple("${headers.category}.xml"))
Run Code Online (Sandbox Code Playgroud)
Exchange.FILE_NAME 是文件名标头的 Camel 常量,使用简单表达式语言,您可以连接在路由中设置为标头的类别名称和静态文件后缀。
如果同一类别再次聚合,则必须进一步扩展文件名(否则类别会覆盖其先前的文件)。例如带有时间戳或类似的。