3

我一直在努力弄清楚为什么某些文件没有正确下载。即使在本地测试并重新启动我的应用程序时,似乎某些文件也不会完全下载。使事情变得更加困难的是,它并不总是一致的。

信息:

  • 阿帕奇骆驼版本:2.20.0
  • 使用 camel-spring-boot-starter 集成到 Spring-Boot 应用程序中
  • 文件大约190M
  • 使用独立的 Jsch 和 Linux sftp 客户端可以正常下载文件
  • 堆大小设置为 1G,内存使用量甚至没有接近最大值
  • 骆驼不会检测到下载有任何问题,即使写入的字节数比骆驼头文件的长度少几十兆(骆驼头文件长度正确)
  • 我观察到 org.apache.camel 日志记录设置为 TRACE 的问题,而在日志中没有看到任何奇怪的东西。
  • Idemoptent repo 被更新,就像文件被正确处理一样
  • 我在 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

删除了上面所有的 log 和 seda email 组件,然后重新运行。第三个文件仍未完全写入。

添加相关的 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
4

1 回答 1

0

啊,您下载后记录该消息,然后使用streamDownload=true.
请参阅此FAQ-why-is-my-message-body-empty以及如果这样做,您需要如何使用流缓存。

因为消息是基于流的,所以要么不记录消息正文(您可以记录标头等),然后将其路由到文件端点,以便将其直接保存为文件。

于 2018-01-17T15:28:32.293 回答