1

我有一个以给定时间间隔扫描 SFTP 服务器的 spring-batch 作业。当它找到一个新文件时,它开始处理。

它适用于大多数情况,但有一种情况不起作用:

  1. 用户开始将新文件上传到 SFTP 服务器
  2. 批处理作业检查服务器并找到一个新文件
  3. 它开始处理它

但是由于文件还在上传中,在处理过程中遇到了输入块的意外结束,出现了错误。

如何在批处理作业开始之前检查文件是否已完全上传到 SFTP 服务器?

4

2 回答 2

2

上传时锁定文件/上传到临时文件名

您可能有一个自动系统监控远程文件夹,并且您希望防止它意外选择尚未完成上传的文件。由于大多数 SFTP 和 FTP 服务器(WebDAV 除外)不支持文件锁定,因此您需要防止自动化系统选择文件。

常见的解决方法是:

  1. 数据文件上传完成后上传“完成”文件,并让自动化系统在处理数据文件之前等待“完成”文件。这是一个简单的解决方案,但不适用于多用户环境。

  2. 将数据文件上传到临时(“上传”)文件夹,并在上传完成后自动将它们移动到目标文件夹。

  3. 将数据文件上传到不同的临时名称,例如使用 .filepart 扩展名,并在上传完成后自动重命名它们。让自动化系统忽略 .filepart 文件。

这里得到

于 2017-01-30T13:19:27.100 回答
0

我们遇到了类似的问题,我们的解决方案是,我们将 spring-batch cron 触发器配置为每 10 分钟触发一次作业(尽管我们可以配置为 5 分钟,因为文件传输时间不到 3 分钟),然后我们读取/处理之前创建的所有文件到 10 分钟。我们假设 FTP 操作在 3 分钟内完成。这给了我们一些额外的灵活性,例如当 spring-batch 应用程序关闭时等。

例如,如果批处理作业在上午 10:20 触发,我们会读取在上午 10:10 之前创建的所有文件,同样在 10:30 运行的作业会读取在 10:20 之前创建的所有文件。

注意:一旦阅读,您需要删除或移动到历史文件夹以进行重复阅读。

于 2017-01-31T10:12:29.603 回答