С Apache Camel, как добавить несколько строк в уже большой файл? - PullRequest
0 голосов
/ 10 января 2020

У меня есть процесс на самом деле с 3 шагами:

  1. переформатировать CSV в другой формат (с использованием split и агрегатора)
  2. вручную добавить несколько строк в качестве верхнего и нижнего колонтитула
  3. zip & send to ftp

Все, что работает корректно при тестировании, но позже я увидел, что шаг 2 завершается неудачно, когда большие CSV передаются для обработки.

Подробная информация об этом шаге 2

Маршрут для шага 2 & 3

      <route id="tozip">
        <from uri="file:{{path}}/out?readLock=changed"/>
        <setBody>
            <simple>resource:file:{{path}}/conf/HeadTxtFoot.txt</simple>
        </setBody>
         <log message="Compressing message..." loggingLevel="INFO" />
         <marshal ref="gzip" />
         <log message="Sending ${file:name}.gz..." loggingLevel="INFO" />
         <to uri="file:{{path}}/tosend/?fileName=${file:name}.gz" />
      </route>

HeadTxtFoot.txt

<tag>
    <informationDate>${headers.date}</informationDate>
    <files>
    ${body}
    </files>
<tag>

Недавно я получил файл размером 350 МБ, входящий в этот маршрут, и у меня есть эта ошибка

Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId              ProcessorId          Processor                                                                        Elapsed (ms)
[tozip             ] [tozip             ] [file:///u01?readLock=changed                 ] [       459]
[tozip             ] [setBody2          ] [setBody[simple{resource:file:{{path}}/conf/HeadTxtFoot.txt}]                  ] [       459]

Stacktrace
--------------------------------------------------------------------------------------------------------------------------------------- 
org.apache.camel.TypeConversionException: Error during type conversion from type: java.lang.String to the required type: java.lang.String with value [Body is file based: GenericFile[/u01/file.xml]] due java.lang.OutOfMemoryError: Java heap space
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.createTypeConversionException(BaseTypeConverterRegistry.java:667)
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.convertTo(BaseTypeConverterRegistry.java:158)
...
Caused by: org.apache.camel.RuntimeCamelException: java.lang.OutOfMemoryError: Java heap space
    at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1831)
    at org.apache.camel.util.ObjectHelper.invokeMethod(ObjectHelper.java:1410)
    at org.apache.camel.impl.converter.StaticMethodTypeConverter.convertTo(StaticMethodTypeConverter.java:59)
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.doConvertTo(BaseTypeConverterRegistry.java:326)
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.convertTo(BaseTypeConverterRegistry.java:141)
    ... 22 more
Caused by: java.lang.OutOfMemoryError: Java heap space

Тот же маршрут без setBody / Simple работает OK

Теперь мой вопрос: каков наилучший способ добавить строки в файл, избегающий ошибки?

1 Ответ

0 голосов
/ 10 января 2020

Ваша проблема заключается в том, что вы читаете весь файл в java память, так что он затем исчерпывает память, давая вам проблему Java пространства кучи.

Исправление: не читайте весь файл в память. Вместо этого используйте «потоки» для потоковой передачи содержимого файла. Для этого вы можете установить параметр потоковой передачи на вашем маршруте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...