如何在使用spring 任务调度处理多个文件时保持一致性?

How to maintain consistency while processing multiple files using spring task scheduling?

我有一个要求,调度程序将在 2 分钟的固定延迟内触发任务。 任务从目录(例如 abc)中挑选所有文件并将它们分发到多个线程进行处理。 每个线程执行以下操作的地方, 1. 从特定文件中读取数据(例如 file1.csv)。 2. 验证后追加一些数据,并将结果数据写入更新(例如 xyz)目录中的另一个文件(例如 file1-updated.csv)。 3. 从目录 abc.

中删除输入文件 file1.csv

当最终用户执行某些操作时,文件将从其他服务器动态推送到 abc 目录。当调度程序每 2 分钟触发一次时,它会拾取所有文件并将它们分发给线程,正如我上面所解释的那样。 现在的问题是 - 假设有 2 个文件 file1.csv 和 file2.csv 并且调度程序选择它们并分发给第一个触发器中的线程。现在 file3.csv 已被推送到 abc 目录,调度程序在 2 分钟后再次触发。现在,只有 file3.csv 应该由调度程序分发给线程,而不是 file1.csv 和 file2.csv,因为它们已经在先前的触发器中被拾取并且正在处理中。我必须确保只有新文件才会分发给线程进行处理。

我可以使用文件锁定机制吗 - 1. 一旦将文件提供给线程,就锁定文件(使用 java 文件锁定机制)。 2.当scheduler第二次触发,将文件分发给线程时,检查文件是否处于锁定状态,如果不是则继续处理,否则从线程中出来。 3. 文件处理完成后,释放锁定并从 abc 文件夹中删除文件。 有没有比文件锁定机制更好的方法来实现这一点?任何帮助表示赞赏。

您可以在选择文件时重命名文件(例如添加后缀 .lock)以将文件标记为 'in progress'。

下次执行任务时,它会过滤掉那些被标记的文件。

现在,如果两个任务同时标记文件(假设固定延迟非常短),您可能会遇到并发问题。在这种情况下,您应该使用 thread-safe 组件来标记正在进行的文件。

一个简单的解决方案是让任务(拾取文件并将它们分发到多个线程的任务)维护一组它已拾取的和当前正在进行的所有文件。下次拾取文件时,它可以签入这个 Set,并在 Set 中添加新文件后只处理新文件。问题是,处理文件的线程在处理完文件后必须从该 Set 中删除。每当您操作此 Set 时,您都必须使用同步块。