0

任何人都可以建议我需要遵循的方法来实现以下要求吗?

背景:

  1. 有一个远程位置,例如"//severname/somefolder/somefile"。某些文件将在远程位置每隔一秒或一分钟连续生成。

  2. 应该要求 Spring Boot 应用程序持续检查在远程位置(通过某些调度程序)生成的新文件。

  3. 如果文件可用,我需要一个一个读取最旧到最新的文件并处理它们可能存储到数据库中。

  4. 处理后,需要从现有远程位置删除特定文件并移动到另一个远程位置文件夹。

我心目中的几点:

  1. 通过使用弹簧批处理,我们可以一次读取一个文件。但是我们如何动态读取最旧的文件呢?

  2. 如何处理这样的场景:如果我的批处理正在处理其中一个文件仍在进行中。如果计划再次运行作业,则有可能选择相同的文件进行处理。

感谢您的解决方案和更好的建议:)

4

1 回答 1

1

轮询目录并为每个传入文件运行作业是一种常见的模式,可以通过 Spring Batch 和 Spring Integration 的组合来实现。您可以在参考文档的通过消息启动批处理作业部分找到有关如何实现此模式的详细说明。

通过使用弹簧批处理,我们可以一次读取一个文件。但是我们如何动态读取最旧的文件呢?

这取决于您决定如何启动工作。如果您决定为每个文件运行不同的作业,则启动作业的代码可以根据需要对文件进行排序并以正确的顺序依次启动作业。MultiResourceItemReader如果您决定使用例如为所有文件运行单个作业,那么您可以提供Comparator根据需要对文件进行排序的 a,请参阅MultiResourceItemReader#setComparator.

如何处理这样的场景:如果我的批处理正在处理其中一个文件仍在进行中。如果计划再次运行作业,则有可能选择相同的文件进行处理。

JobLaunchRequest这取决于您使用的调度工具,即它是否支持并发作业执行等。如果已成功提交a 的文件,轮询目录并将作业请求放入队列的模式将通过设计解决此问题队列从远程目录(重新)移出(即后续轮询不会看到它,也不会为它创建重复请求)。

于 2021-07-08T10:29:17.523 回答