当前位置: 首页 > 知识库问答 >
问题:

Spring批处理作业开始处理文件未完全上载到SFTP服务器

夏侯昆琦
2023-03-14

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

它在大多数情况下都可以正常工作,但有一种情况下它不起作用:

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

但由于文件仍在上载中,因此在处理过程中遇到意外的输入块结尾,并发生错误。

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

共有2个答案

宿建本
2023-03-14

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

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

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

景明诚
2023-03-14

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

您可能有一个自动系统监视远程文件夹,并且希望防止它意外地拾取尚未完成上载的文件。由于大多数SFTP和FTP服务器(WebDAV除外)不支持文件锁定,因此需要防止自动系统以其他方式拾取文件。

常见的解决方法有:

>

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

    将数据文件上载到临时(“上载”)文件夹,并在上载完成后以原子方式将其移动到目标文件夹。

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

    从这里得到的

  •  类似资料:
    • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

    • 我使用Spring批处理管理来管理和监视作业和执行。如何调用一个作业并从一个独立的java应用程序启动它,该应用程序具有到包含Spring Batch Admin WebApp的服务器的给定HTTP连接。 谢谢你的帮助

    • 根据Spring batch JobOperator类的文档, https://docs.spring.io/spring-batch/4.0.x/api/org/springframework/batch/core/launch/JobOperator.html#restart-long- 重新启动失败或停止的作业执行。如果提供的id不存在或对应于在正常情况下已成功完成的JobInstance,

    • 我最近开始使用java配置方式编写spring批处理程序,并使用spring批处理和starter包。我使用了分区的步骤和任务执行器来完成我的工作,我面临的问题是,一旦作业完成,批处理过程就不会停止,它一直在我的eclipse和Linux盒子中运行。我手动找到并终止作业。你能帮个忙吗。当我在没有分区步骤的情况下以单线程的方式运行作业时,这工作很好。 我的作业配置:

    • 我正在尝试创建一个应用程序,该应用程序使用spring-batch-excel扩展名来读取用户通过web界面上传的Excel文件,以便解析Excel文件中的地址。 当代码运行时,没有错误,但我得到的只是我日志中的以下内容。即使我的处理器和Writer中都有log/syso(它们从未被调用过,我所能想象的是它没有正确读取文件,也没有返回要处理/写入的数据)。是的,这个文件有数据,实际上有几千条记录。