2011-08-30 80 views
9

我正嘗試拆分一個ArrayList,寫各種元素it's使用Apache的駱駝就像這個簡化的例子自己的文件:駱駝:分割集合,並寫入文件

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

每個日誌打印項目,但只有「三個」被保存到一個文件。我究竟做錯了什麼?

1月

回答

7

如果文件已經存在,文件生產者將默認「覆蓋」。

看到它的文檔頁面 http://camel.apache.org/file2

的fileExist選項由於輸入到這條線路也是一個文件,那麼生產者將「繼承」從輸入文件名。

所以你的情況,如果你想保存每個分裂的消息在一個新的文件,那麼你就需要設置一個目標文件名,文件名選項

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

filename選項,支持簡單文件語言

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

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

這意味着該文件名可以是DY namic計算出的,如上所述,其中$ {id}是唯一的消息ID。

+0

嗯,這個解決方案不適合我(使用駱駝2.4)。結果只是一個文件。但是這個工作:'.setHeader(「CamelFileName」,simple(body()。toString()))' – jpstrube

6

在你調用split函數之後,你的路由被分成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第二個例子。

我們假設你想explose XML爲每個節點爲了裏面的元素名稱:

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

我們假設我們想爆炸這個XML文件中的2個文件

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