Apache camel Camel:拆分集合并写入文件

Apache camel Camel:拆分集合并写入文件,apache-camel,Apache Camel,我正在尝试拆分一个ArrayList,并使用Apache Camel将每个元素写入自己的文件,如下面的简化示例所示: from("timer://poll?period=10000").process(new Processor(){ public void process(Exchange exchange){ ArrayList<String> list = new ArrayList<String>(); list.add("

我正在尝试拆分一个ArrayList,并使用Apache Camel将每个元素写入自己的文件,如下面的简化示例所示:

from("timer://poll?period=10000").process(new Processor(){
    public void process(Exchange exchange){
        ArrayList<String> list = new ArrayList<String>();
        list.add("one");
        list.add("two");
        list.add("three");
        exchange.getIn().setBody(list, ArrayList.class);
    }
}).split(body()).log(body().toString()).to("file:some/dir");
from(“timer://poll?period=10000)进程(新处理器(){
公共作废流程(交换){
ArrayList=新建ArrayList();
列表。添加(“一”);
列表。添加(“两个”);
列表。添加(“三”);
exchange.getIn().setBody(list,ArrayList.class);
}
}).split(body()).log(body().toString()).to(“文件:some/dir”);
日志打印每个项目,但只有“三个”保存到文件中。我做错了什么


Jan

如果文件已经存在,则默认情况下,文件生成器将“覆盖”

请参见文档页面上的fileExist选项

由于此路由的输入也是一个文件,因此生产者将从输入中“继承”文件名

因此,在您的情况下,如果要将每个拆分的消息保存在新文件中,则需要使用fileName选项设置目标文件名

"file:some/dir?fileName=splitted-${id}"
文件名选项支持简单和文件语言


这意味着可以动态计算文件名,如上所述,其中${id}是唯一的消息id。

调用split函数后,您的路由分为3种方式,之后执行的每个方法或路由应用于每个进程方式

在每种处理方式中,split方法都添加了CamelSplitIndex属性

所以这个代码应该可以工作

from("timer://poll?period=10000").process(new Processor(){
    public void process(Exchange exchange){
        ArrayList<String> list = new ArrayList<String>();
        list.add("one");
        list.add("two");
        list.add("three");
        exchange.getIn().setBody(list, ArrayList.class);
    }
}).split(body()).log(body().toString()).to("file:some/dir?fileName=${header.CamelSplitIndex}");

嗯,这个解决方案不适合我(使用Camel 2.4)。结果还是只有一个文件。但这是可行的:
.setHeader(“CamelFileName”,simple(body().toString())
<orders>
  <order>
    <name>Order 1</name>
  </order>
  <order>
    <name>Order 2</name>
  </order>
</order>
from("file://repo-source").split(xpath("//orders/order")).setHeader("orderName", xpath("/order/name").stringResult()).to("file://repo?fileName=${header.orderName}.xml");