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