开发者

Camel: Splitting a collection and writing to files

I´m trying to split an ArrayList and writing each element to it´s own file using Apache Camel like in this simplified example:

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");

The log prints each item but only "three" is saved to a file. What am I doing w开发者_C百科rong?

Jan


After you called split function, your route is divided in 3 ways, each method or route executed after that is applied on each process way.

In each process way, split method add CamelSplitIndex property.

So this code should work

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}");

This is second example with xml file and xpath.

We suppose that you want to explose xml for each node order with an element name inside:

<orders>
  <order>
    <name>Order 1</name>
  </order>
  <order>
    <name>Order 2</name>
  </order>
</order>

We suppose that we want to explode this xml file in 2 files

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


The file producer will by default "override" if a file already exists.

See the fileExist option at its documentation page http://camel.apache.org/file2

Since the input to this route is also a file, then the producer will "inherit" the file name from the input.

So in your case if you want to save each splitted message in a new file, then you would need to set a target file name, using the fileName option

"file:some/dir?fileName=splitted-${id}"

The fileName option supports the simple and file language

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

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

That means the file name can be dynamic computed, such as above, where ${id} is an unique message id.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜