Apache Camel не полностью загружает некоторые файлы из SFTP

Я изо всех сил пытался понять, почему некоторые файлы загружаются неправильно. Похоже, что некоторые файлы просто не будут загружены полностью, даже при локальном тестировании и перезапуске моего приложения. Чтобы усложнить ситуацию, это не всегда последовательно.

Информация:

  • Версия Apache Camel: 2.20.0
  • Интегрирован в приложение Spring-Boot с помощью программы camel-spring-boot-starter.
  • Файлы около 190M
  • Файлы загружаются нормально, используя автономный клиент JSCH и Linux sftp
  • Размер кучи установлен на 1 ГБ, а использование памяти даже не приближается к максимальному
  • Camel не обнаруживает ничего плохого в загрузке, даже если количество записанных байтов на десятки мегабайт меньше длины файла в соответствии с верблюжьими заголовками (верблюжьи заголовки имеют правильную длину файла)
  • Я заметил проблему с настройкой ведения журнала org.apache.camel на TRACE, но не увидел ничего странного в журналах.
  • Идемоптентное репо обновляется, как если бы файл был обработан правильно
  • Я вижу ту же проблему в Linux и Windows

Любые советы по поводу того, в чем может быть проблема, или предложения по устранению неполадок были бы замечательными!

Конфигурация маршрута (немного искусственно созданная, поскольку значения взяты из конфигурации spring -boot):

public class FileRouteBuilder extends RouteBuilder {
 // Cut

    @Override
    public void configure() throws Exception {

        errorHandler(deadLetterChannel("seda:"+ROUTE_ID_ERROR_EMAIL));      

        from("sftp://username@hostname/OUT?noop=true&streamDownload=true&password=password&include=Data_file.*csv&idempotentRepository=#keyRepo&greedy=true&delay=5m&maxMessagesPerPoll=10&readLock=changed")
        .id(routeConfig.getRouteId())
        .routeDescription(routeConfig.getRouteId())
        .setHeader(HEADER_FILE_SOURCE, constant(routeConfig.getRouteId()))
        .to("log:feeds." + routeConfig.getRouteId() + "?level=INFO&showAll=true")
        // Exclude all files oder than the specified number of hours
        .filter(new FileModifiedSincePredicate(24))
        .to(file:rootDir/DATA)
        .to("seda:" + ROUTE_ID_ACTIVITY_EMAIL_NOTIFICATION)
        .end();
       }
    }
}

Обновление1

Наблюдения после добавления binary=true.

Первые два файла загружаются правильно, а третий и последний файл на сервере - нет.

193255587 Data_File_12.csv
191072548 Data_File_15.csv
139929360 Data_File_16.csv

Правильный размер файла Data_FIle_16.csv составляет 192867682 байта, что правильно зафиксировано в заголовке CamelFileLength.

Обновление 2

Удалил все компоненты электронной почты журнала и seda, указанные выше, и перезапустил. Третий файл все еще не полностью записан.

Добавление соответствующего вывода журнала уровня DEBUG в надежде, что он проливает свет на то, что происходит, или, возможно, исключает определенные вещи.

Насколько я могу судить, в журнале нет ничего подозрительного и нет намека на то, что файл _16 написан не полностью.

Есть ли что-нибудь, что может происходить на сервере SFTP, о чем всем известно и что стоит уточнить у провайдера?

o.a.c.c.file.remote.SftpConsumer         : Took 0.194 seconds to poll: OUT
o.a.c.c.file.remote.SftpConsumer         : Total 3 files to consume
o.a.c.c.file.remote.SftpConsumer         : About to process file: RemoteFile[Data_File_12.csv] using exchange: Exchange[]
o.apache.camel.processor.SendProcessor   : >>>> file://target/file-dest/MISA Exchange[ID-LON-2016-1516204084378-0-1]
o.a.camel.component.file.FileOperations  : Using InputStream to write file: target\file-dest\MISA\Data_File_12.csv
o.a.camel.converter.jaxp.XmlConverter    : Created TransformerFactory: com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl@d9dfe93
o.a.c.c.file.GenericFileProducer         : Wrote [target\file-dest\MISA\Data_File_12.csv] to [file://target/file-dest/MISA]
o.a.c.c.file.GenericFileOnCompletion     : Done processing file: RemoteFile[Data_File_12.csv] using exchange: Exchange[ID-LON-2016-1516204084378-0-1]
o.a.c.p.i.FileIdempotentRepository       : Appending Data_File_12.csv-193255587 to idempotent filestore: target\file-dest\.file-key-repo\repo
o.a.c.c.file.remote.SftpConsumer         : About to process file: RemoteFile[Data_File_15.csv] using exchange: Exchange[]
o.apache.camel.processor.SendProcessor   : >>>> file://target/file-dest/MISA Exchange[ID-LON-2016-1516204084378-0-2]
o.a.camel.component.file.FileOperations  : Using InputStream to write file: target\file-dest\MISA\Data_File_15.csv
o.a.c.c.file.GenericFileProducer         : Wrote [target\file-dest\MISA\Data_File_15.csv] to [file://target/file-dest/MISA]
o.a.c.c.file.GenericFileOnCompletion     : Done processing file: RemoteFile[Data_File_15.csv] using exchange: Exchange[ID-LON-2016-1516204084378-0-2]
o.a.c.p.i.FileIdempotentRepository       : Appending Data_File_15.csv-191072548 to idempotent filestore: target\file-dest\.file-key-repo\repo
o.a.c.c.file.remote.SftpConsumer         : About to process file: RemoteFile[Data_File_16.csv] using exchange: Exchange[]
o.apache.camel.processor.SendProcessor   : >>>> file://target/file-dest/MISA Exchange[ID-LON-2016-1516204084378-0-3]
o.a.camel.component.file.FileOperations  : Using InputStream to write file: target\file-dest\MISA\Data_File_16.csv
o.a.c.c.file.GenericFileProducer         : Wrote [target\file-dest\MISA\Data_File_16.csv] to [file://target/file-dest/MISA]
o.a.c.c.file.GenericFileOnCompletion     : Done processing file: RemoteFile[Data_File_16.csv] using exchange: Exchange[ID-LON-2016-1516204084378-0-3]
o.a.c.p.i.FileIdempotentRepository       : Appending Data_File_16.csv-192867682 to idempotent filestore: target\file-dest\.file-key-repo\repo

person Micke    schedule 16.01.2018    source источник
comment
Наблюдаете ли вы те же результаты, когда используете, скажем, «прямой» компонент вместо компонента «седа» у потребителя верблюда? Кроме того, если это происходит каждый раз, вы можете проверить целостность файла и полученный размер, используя код вроде mkyong.com/java/how-to-generate-a-file-checksum-value-in-java и с верблюдом маршрут вроде ‹в uri = bean: checkSum /› ‹! - Проверить целостность файла -› ‹в uri = seda: component /›   -  person Viral Gohel    schedule 17.01.2018
comment
Вы пробовали установить binary=true для включения двоичного режима   -  person Claus Ibsen    schedule 17.01.2018
comment
Пытался установить параметр binary=true, но столкнулся с той же проблемой. Еще несколько отформатированных деталей в обновлении 1 вопроса.   -  person Micke    schedule 17.01.2018


Ответы (1)


Ах, вы регистрируете сообщение после его загрузки и используете streamDownload=true.
См. FAQ-why-is-my-message-body-empty и как в этом случае нужно использовать кеширование потока.

Поскольку сообщение основано на потоковой передаче, либо НЕ регистрируйте тело сообщения (вы можете регистрировать заголовки и т. Д.), А затем перенаправляйте его в конечную точку файла, чтобы оно сохранялось непосредственно как файл.

person Claus Ibsen    schedule 17.01.2018
comment
Спасибо за предложение, я удалил все журналы и попробовал еще раз, но, к сожалению, все еще вижу ту же проблему. Добавлена ​​небольшая дополнительная информация о регистрации в обновлении 2 в вопросе, если она дает какие-либо подсказки. - person Micke; 18.01.2018