我有一个以给定时间间隔扫描 SFTP 服务器的 spring-batch 作业。当它找到一个新文件时,它开始处理。
它适用于大多数情况,但有一种情况不起作用:
- 用户开始将新文件上传到 SFTP 服务器
- 批处理作业检查服务器并找到一个新文件
- 它开始处理它
但是由于文件还在上传中,在处理过程中遇到了输入块的意外结束,出现了错误。
如何在批处理作业开始之前检查文件是否已完全上传到 SFTP 服务器?
我有一个以给定时间间隔扫描 SFTP 服务器的 spring-batch 作业。当它找到一个新文件时,它开始处理。
它适用于大多数情况,但有一种情况不起作用:
但是由于文件还在上传中,在处理过程中遇到了输入块的意外结束,出现了错误。
如何在批处理作业开始之前检查文件是否已完全上传到 SFTP 服务器?
上传时锁定文件/上传到临时文件名
您可能有一个自动系统监控远程文件夹,并且您希望防止它意外选择尚未完成上传的文件。由于大多数 SFTP 和 FTP 服务器(WebDAV 除外)不支持文件锁定,因此您需要防止自动化系统选择文件。
常见的解决方法是:
数据文件上传完成后上传“完成”文件,并让自动化系统在处理数据文件之前等待“完成”文件。这是一个简单的解决方案,但不适用于多用户环境。
将数据文件上传到临时(“上传”)文件夹,并在上传完成后自动将它们移动到目标文件夹。
将数据文件上传到不同的临时名称,例如使用 .filepart 扩展名,并在上传完成后自动重命名它们。让自动化系统忽略 .filepart 文件。
从这里得到
我们遇到了类似的问题,我们的解决方案是,我们将 spring-batch cron 触发器配置为每 10 分钟触发一次作业(尽管我们可以配置为 5 分钟,因为文件传输时间不到 3 分钟),然后我们读取/处理之前创建的所有文件到 10 分钟。我们假设 FTP 操作在 3 分钟内完成。这给了我们一些额外的灵活性,例如当 spring-batch 应用程序关闭时等。
例如,如果批处理作业在上午 10:20 触发,我们会读取在上午 10:10 之前创建的所有文件,同样在 10:30 运行的作业会读取在 10:20 之前创建的所有文件。
注意:一旦阅读,您需要删除或移动到历史文件夹以进行重复阅读。