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

标签 java spring multithreading scheduler

我有一个要求,调度程序将在 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 文件夹中删除该文件。 有没有比文件锁定机制更好的方法来实现这一点?任何帮助表示赞赏。

最佳答案

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

关于java - 使用spring任务调度处理多个文件时如何保持一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49570994/

相关文章:

Spring @Component 和 @Bean 注解

java - spring jdbctemplate批量更新快速替代

java - 重新绘制椭圆,JAVA Swing/AWT

java - 如何将ArrayList拆分为另一个List

java - 使用计时器倒计时

c++ - OMP部分中的线程数

java - 这个命令模式是线程安全的吗?

java - Jackson - 从 json 字符串列表中读取特定字段

java - Spring Boot集成测试具有多个参数的模拟bean方法返回null

django - 带有 Django 的 PyMySQL,多线程应用程序