2011-11-14 16 views
12

Chciałbym opracować trasę, która sonduje katalog zawierający pliki CSV, a dla każdego pliku usuwa wszystkie wiersze za pomocą Bindy i umieszcza je w activemq.Najlepsza strategia przetwarzania dużych plików CSV w Apache Camel

Problem polega na tym, że pliki mogą być dość duże (miliony wierszy), więc wolałbym kolejkować jeden wiersz naraz, ale otrzymuję wszystkie wiersze w java.util.ArrayList na końcu Bindy, która powoduje problemy z pamięcią.

Do tej pory mam mały test, który działa bez zakłóceń, więc konfiguracja Bindy przy użyciu adnotacji jest w porządku.

Oto trasa:

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

Środowisko jest: Eclipse Indigo, Maven 3.0.3, 2.8.0 Camel

Dziękuję

Odpowiedz

26

Jeśli używasz rozgałęźnika EIP następnie można użyj trybu strumieniowego, co oznacza, że ​​Camel będzie przetwarzał plik w kolejności od rzędu.

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

Dzięki Mikołaj za swoje odpowiedź. Teraz mam inny problem. Podążając za moim małym ćwiczeniem, próbuję wyodrębnić z kolejki i napisać do pliku z '.convertBodyTo (String.class) .to (" file: data/outbox? FileExist = Append ")' ale tylko pierwszy wiersz dostaje pisemny. Mimo wszystko, jeśli użyję opcji pliku Zastąp, otrzymam tylko ostatni wiersz. Czy istnieje sposób na zapisanie wszystkich wierszy z pliku CSV do pliku ?. Dziękujemy – Taka

+0

Musisz podać nazwę pliku, .to ("file: data/outbox? FileName = data.csv i fileExist = Append") –

+0

Dodaj '.thread()' po '.streaming()' może być bardziej wydajne ? – Pith

2

Dla przypomnienia i dla innych użytkowników, które mogą być przeszukiwane za to jak mnie, tymczasem wydaje się być łatwiejsza metoda, która również działa dobrze z 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"); 
Powiązane problemy