Camel:拆分集合并写入文件

jps*_*ube 12 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("one");
        list.add("two");
        list.add("three");
        exchange.getIn().setBody(list, ArrayList.class);
    }
}).split(body()).log(body().toString()).to("file:some/dir");
Run Code Online (Sandbox Code Playgroud)

日志打印每个项目,但只有"三"保存到文件.我究竟做错了什么?

一月

Thi*_*aut 8

调用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}");
Run Code Online (Sandbox Code Playgroud)

这是xml文件和xpath的第二个示例.

我们假设您想要为每个节点顺序探索xml,其中包含一个元素名称:

<orders>
  <order>
    <name>Order 1</name>
  </order>
  <order>
    <name>Order 2</name>
  </order>
</order>
Run Code Online (Sandbox Code Playgroud)

我们假设我们想要在2个文件中分解这个xml文件

from("file://repo-source").split(xpath("//orders/order")).setHeader("orderName", xpath("/order/name").stringResult()).to("file://repo?fileName=${header.orderName}.xml");
Run Code Online (Sandbox Code Playgroud)


Cla*_*sen 7

如果文件已存在,文件生成器将默认"覆盖".

请参阅其文档页面http://camel.apache.org/file2上的fileExist选项

由于此路由的输入也是文件,因此生产者将从输入"继承"文件名.

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

"file:some/dir?fileName=splitted-${id}"
Run Code Online (Sandbox Code Playgroud)

fileName选项支持简单和文件语言

http://camel.apache.org/simple.html

http://camel.apache.org/file-language.html

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