我正在尝试拆分一个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");
日志打印每个项目,但只有“三”保存到文件中。我做错了什么?
扬
答案 0 :(得分:8)
调用分割功能后,您的路线将以3种方式划分,之后执行的每种方法或路线都应用于每种流程方式。
在每种流程方式中,拆分方法添加 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}");
这是xml文件和xpath的第二个例子。
我们假设您想要为每个节点订单开发xml,其中包含一个元素名称:
<orders>
<order>
<name>Order 1</name>
</order>
<order>
<name>Order 2</name>
</order>
</order>
我们假设我们想要在2个文件中分解这个xml文件
from("file://repo-source").split(xpath("//orders/order")).setHeader("orderName", xpath("/order/name").stringResult()).to("file://repo?fileName=${header.orderName}.xml");
答案 1 :(得分:7)
如果文件已经存在,文件生成器将默认“覆盖”。
请参阅其文档页面上的fileExist选项 http://camel.apache.org/file2
由于此路由的输入也是一个文件,因此生产者将从输入中“继承”文件名。
因此,在您的情况下,如果要将每个拆分的消息保存在新文件中,则需要使用fileName选项设置目标文件名
"file:some/dir?fileName=splitted-${id}"
fileName选项支持简单和文件语言
http://camel.apache.org/simple.html
http://camel.apache.org/file-language.html
这意味着文件名可以动态计算,如上所述,其中$ {id}是唯一的消息ID。