2011-11-14 12 views
12

Me gustaría desarrollar una ruta que sondee un directorio que contenga archivos CSV, y para cada archivo deshace cada fila usando Bindy y la pone en colas en activemq.La mejor estrategia para procesar archivos CSV grandes en Apache Camel

El problema es que los archivos pueden ser bastante grandes (un millón de filas), por lo que preferiría hacer cola una fila a la vez, pero lo que obtengo son todas las filas en java.util.ArrayList al final de Bindy que causa problemas de memoria.

Hasta ahora tengo una pequeña prueba y la eliminación de marcas está funcionando, por lo que la configuración de Bindy con anotaciones está bien.

Aquí es la ruta:

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .unmarshal() 
    .bindy(BindyType.Csv, "com.ess.myapp.core")   
    .to("jms:rawTraffic"); 

Medio Ambiente es: Eclipse Indigo, Maven 3.0.3, 2.8.0 Camel

Gracias

Respuesta

26

si se utiliza el divisor EIP entonces se puede use el modo de transmisión, lo que significa que Camel procesará el archivo fila por fila.

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .split(body().tokenize("\n")).streaming() 
    .unmarshal().bindy(BindyType.Csv, "com.ess.myapp.core")   
    .to("jms:rawTraffic"); 
+0

Gracias por su responder. Ahora estoy enfrentando un problema diferente. Siguiendo con mi pequeño ejercicio, intento extraer de la cola y escribir en un archivo con '.convertBodyTo (String.class) .to (" file: data/outbox? FileExist = Append ")' pero solo se obtiene la primera fila escrito. De todos modos, si utilizo la opción de archivo Sobrescribir solo obtengo la última fila. ¿Hay alguna manera de tener todas las filas del archivo CSV escritas en el archivo ?. Gracias – Taka

+0

Debe especificar un nombre de archivo, .to ("file: data/outbox? FileName = data.csv & fileExist = Append") –

+0

Agregar '.thread()' después de '.streaming()' podría ser más eficiente ? – Pith

2

Para el registro y para otros usuarios que podrían haber buscado esto tanto como yo, mientras tanto, parece que hay un método más fácil que también funciona bien con useMaps: Noel

CsvDataFormat csv = new CsvDataFormat() 
    .setLazyLoad(true) 
    .setUseMaps(true); 

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .unmarshal(csv) 
    .split(body()).streaming() 
    .to("log:mappedRow?multiline=true"); 
Cuestiones relacionadas