2011-11-14 16 views
12

Mi piacerebbe sviluppare un percorso che esegue il polling di una directory contenente file CSV e per ogni file unmarsena ogni riga utilizzando Bindy e lo accoda in activemq.La migliore strategia per l'elaborazione di file CSV di grandi dimensioni in Apache Camel

Il problema è che i file possono essere piuttosto grandi (un milione di righe) quindi preferirei mettere in coda una riga alla volta, ma quello che sto ottenendo sono tutte le righe in una java.util.ArrayList alla fine di Bindy che causa problemi di memoria.

Finora ho un piccolo test e unmarshalling funziona così la configurazione di Bindy usando le annotazioni è ok.

Ecco il percorso:

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

Ambiente è: Eclipse Indigo, Maven 3.0.3, 2.8.0 Camel

Grazie

risposta

26

se si utilizza lo Splitter EIP allora si può usa la modalità streaming, il che significa che Camel elaborerà il file riga per riga.

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

Grazie Natale per la vostra risposta. Ora sto affrontando un problema diverso. Seguendo il mio piccolo esercizio sto cercando di estrarre dalla coda e scrivere in un file con '.convertBodyTo (String.class) .to (" file: data/outbox? FileExist = Append ")' ma solo la prima riga viene scritto. Comunque, se uso l'opzione File Override, ottengo solo l'ultima riga. C'è un modo per avere tutte le righe dal file CSV scritte nel file ?. Grazie – Taka

+0

È necessario specificare un nome file, .to ("file: data/outbox? FileName = data.csv & fileExist = Append") –

+0

Aggiungi '.thread()' dopo '.streaming()' potrebbe essere più efficiente ? – Pith

2

Per la cronaca e per gli altri utenti che potrebbero essere cercati per questo tanto quanto me, nel frattempo sembra che ci sia un metodo più semplice che funziona bene anche con useMaps:

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