2011-08-30 15 views
9

Estoy tratando de dividir un ArrayList y escribir cada elemento de iT archivo propio uso de Apache Camel como en este ejemplo simplificado:Camello: División de una colección y escribir en archivos

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

se imprime el registro de cada elemento pero solo "tres" se guarda en un archivo. ¿Qué estoy haciendo mal?

Ene

Respuesta

7

El productor de archivos de forma predeterminada "anular" si ya existe un archivo.

ver la opción de fileExist en su página de documentación http://camel.apache.org/file2

Desde la entrada a esta ruta es también un archivo, entonces el productor "heredará" el nombre de archivo de la entrada.

Así, en su caso si desea guardar cada mensaje dividido en un nuevo archivo, entonces usted tendría que establecer un nombre de archivo de destino, utilizando la opción filename

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

la opción filename apoya la simple y idioma archivo

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

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

Eso significa que el nombre de archivo puede ser dy namic calculado, como el anterior, donde $ {id} es una identificación de mensaje única.

+0

Hmm, esta solución no funciona para mí (usando Camel 2.4). El resultado es nuevamente solo un archivo. Pero esto funciona: '.setHeader (" CamelFileName ", simple (body(). ToString()))' – jpstrube

6

Después de llamar a la función de división, su ruta se divide en 3 formas, cada método o ruta que se ejecuta después se aplica en cada forma de proceso.

En cada forma de proceso, método de división agregue CamelSplitIndex propiedad.

lo que este código debería funcionar

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

Este es el segundo ejemplo de archivo XML y XPath.

Suponemos que desea un peligro de explosión XML para cada nodo fin con un nombre de elemento en el interior:

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

Suponemos que queremos explotar este archivo XML en 2 archivos

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