【问题标题】:Spring batch job start processing file not fully uploaded to the SFTP serverSpring批处理作业启动处理文件未完全上传到SFTP服务器
【发布时间】:2017-01-30 12:44:10
【问题描述】:
我有一个 spring-batch 作业以给定的时间间隔扫描 SFTP 服务器。当它找到一个新文件时,它开始处理。
它在大多数情况下都可以正常工作,但有一种情况不起作用:
- 用户开始将新文件上传到 SFTP 服务器
- 批处理作业检查服务器并找到新文件
- 它开始处理它
但是由于文件还在上传中,所以在处理过程中遇到了input block的unexpected end of input block,报错。
如何在批处理作业开始之前检查文件是否已完全上传到 SFTP 服务器?
【问题讨论】:
标签:
spring
spring-integration
spring-batch
spring-integration-sftp
【解决方案1】:
上传时锁定文件/上传到临时文件名
您可能有一个监控远程文件夹的自动化系统,并且您希望防止它意外选择尚未完成上传的文件。由于大多数 SFTP 和 FTP 服务器(WebDAV 除外)不支持文件锁定,否则您需要防止自动化系统选择文件。
常见的解决方法是:
数据文件上传完成后上传“完成”文件并
自动化系统在处理之前等待“完成”文件
数据文件。这是一个简单的解决方案,但不适用于多用户
环境。
将数据文件上传到临时(“上传”)文件夹,并在上传完成后自动将它们移动到目标文件夹。
将数据文件上传到不同的临时名称,例如使用 .filepart 扩展名,并在上传完成后自动重命名它们。让自动化系统忽略 .filepart 文件。
来自here
【解决方案2】:
我们遇到了类似的问题,我们的解决方案是,我们将 spring-batch cron 触发器配置为每 10 分钟触发一次作业(尽管我们可以配置为 5 分钟,因为文件传输花费的时间不到 3 分钟),然后我们读取/处理所有10 分钟之前创建的文件。我们假设 FTP 操作在 3 分钟内完成。这给了我们一些额外的灵活性,例如当 spring-batch 应用程序关闭时等。
例如,如果批处理作业在上午 10:20 触发,我们会读取在上午 10:10 之前创建的所有文件,同样,在 10:30 运行的作业会读取在 10:20 之前创建的所有文件。
注意:一旦阅读,您需要删除或移动到历史文件夹以进行重复阅读。