【发布时间】:2018-04-09 14:00:19
【问题描述】:
我有一个要求,调度程序将在 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. 当调度器第二次触发并将文件分发到线程时,检查文件是否处于锁定状态,如果没有则仅进一步处理,否则刚刚从线程中出来。 3. 文件处理完成后,解除锁定并从 abc 文件夹中删除文件。 有没有比文件锁定机制更好的方法来实现这一点?任何帮助表示赞赏。
【问题讨论】:
-
两个线程同时处理两个文件比一个线程顺序处理两个文件更快的基本假设可能是错误的。您需要先对此进行调查。
标签: java spring multithreading scheduler