2011-08-30 11 views
9

Próbuję podzielić ArrayList i pisania każdego elementu do its własny plik przy użyciu Apache Camel jak w tym uproszczonym przykładzie:Camel: Dzielenie zbierania i zapisywania plików

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

drukuje dziennika każdy element, ale tylko "trzy" jest zapisany w pliku. Co ja robię źle?

Jan

Odpowiedz

7

Producent plik zostanie domyślnie „ręcznym”, jeśli plik już istnieje.

Zobacz opcję fileExist na jego stronie dokumentacji http://camel.apache.org/file2

Ponieważ wejście do tej trasy jest również plik, to producent będzie „dziedziczą” nazwę pliku z wejścia.

Więc w twoim przypadku, jeśli chcesz zapisać każdy rozdzielonego wiadomość w nowym pliku, wtedy trzeba ustawić nazwę pliku docelowego, korzystając z opcji fileName

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

Opcja fileName obsługuje proste i język plik

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

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

oznacza to, że nazwa pliku może być dy obliczone na podstawie nazw, takie jak powyżej, gdzie $ {id} jest unikalnym identyfikatorem wiadomości.

+0

Hmm, to rozwiązanie nie działa dla mnie (używając Camel 2.4). Rezultatem jest ponownie tylko jeden plik. Ale to działa: '.setHeader (" CamelFileName ", prosty (body(). ToString()))' – jpstrube

6

Po wywołaniu funkcji podziału, twoja trasa jest podzielona na 3 sposoby, każda metoda lub trasa jest wykonywana po tym, jak jest stosowana na każdy sposób procesu.

W każdym sposobie procesu, metoda podziału dodaj właściwość CamelSplitIndex.

Więc ten kod powinien działać

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

Jest to drugi przykład z pliku XML i XPath.

Przypuszczamy, że chcesz explose xml dla każdego węzła zamówienia z nazwy elementu wewnątrz:

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

założymy, że chcemy, aby eksplodować tego pliku xml w 2 plikach

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