Лучшая стратегия обработки больших файлов CSV в Apache Camel

Я хотел бы разработать маршрут, который опросит каталог, содержащий CSV файлы, и для каждого файла он отменяет каждую строку с помощью Bindy и ставит ее в очередь в activemq.

Проблема в том, что файлы могут быть довольно большими (миллион строк), поэтому я бы предпочел поочередно очереди по одной строке, но то, что я получаю, это все строки в java.util.ArrayList в конце Бинди, которая вызывает проблемы с памятью.

До сих пор у меня есть небольшой тест, и работа с ним не работает, поэтому настройка Bindy с использованием аннотаций в порядке.

Вот маршрут:

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

Окружающая среда: Eclipse Indigo, Maven 3.0.3, Camel 2.8.0

Спасибо

Ответ 1

Если вы используете Splitter EIP, вы можете использовать режим потоковой передачи, что означает, что Camel будет обрабатывать файл по строкам за строкой.

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

Ответ 2

Для записи и для других пользователей, которые могли бы найти ее так же сильно, как и я, между тем, похоже, есть более простой метод, который также хорошо работает с 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");