如何使用 spring 批处理读取在远程位置生成的文件,处理并移动到另一个位置?

How to read the Files generating at remote location, process and move to another location by using spring batch?

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

背景:

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

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

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

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

我心中的点数:

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

  2. 如何处理以下情况:如果我的批处理正在处理其中一个文件仍在进行中。如果调度程序再次运行该作业,则有机会选择相同的文件进行处理。

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

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

By using the spring batch we can read one file at a time. but how can we read the oldest file dynamically?

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

How to handle the scenario like: if my batch is processing one of the files is still in progress. if the schedular runs the job again there is a chance of picking the same file for processing.

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