Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在使用spring任务调度处理多个文件时保持一致性?_Java_Spring_Multithreading_Scheduler - Fatal编程技术网

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

Java 如何在使用spring任务调度处理多个文件时保持一致性?,java,spring,multithreading,scheduler,Java,Spring,Multithreading,Scheduler,我有一个要求,调度程序将触发在2分钟的固定延迟任务。 任务从目录(例如abc)中选取所有文件,并将它们分发到多个线程进行处理。 其中每个线程执行以下操作, 1.从特定文件(例如file1.csv)读取数据。 2.验证后追加更多数据,并将结果数据写入更新(例如xyz)目录中的一个或多个文件(例如file1 updated.csv)。 3.从abc目录中删除输入文件file1.csv 当最终用户执行某些操作时,文件将从其他服务器动态推送到abc目录。当调度程序每2分钟触发一次时,它将拾取所有文件并将

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

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

我可以使用文件锁定机制吗- 1.一旦文件被提供给线程,就锁定它(使用java文件锁定机制)。 2.当调度器第二次触发并将文件分发到线程时,请检查文件是否处于锁定状态,如果不是,则仅进一步处理,否则仅从线程中退出。 3.一旦文件处理完成,释放锁并从abc文件夹中删除文件。 有没有比文件锁定机制更好的方法来实现这一点?谢谢你的帮助

选择文件以将文件标记为“正在进行”时,可以重命名文件(例如添加后缀.lock)

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

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

您可以在选择文件以将文件标记为“正在进行”时重命名文件(例如添加后缀.lock)

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


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

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

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

两个线程同时处理两个文件的基本假设可能比一个线程依次处理两个文件的速度快,这可能是错误的。你需要先研究一下,两个线程同时处理两个文件比一个线程顺序处理两个文件快的基本假设可能是错误的。你需要先调查一下,谢谢阿穆丹!这个解决方案看起来不错。但我还想检查是否可以通过文件锁定机制实现这一点。我已经更新了问题。请告诉我您的想法。@bharath,我对FileLock了解不多,但javadoc说“文件锁代表整个Java虚拟机持有。它们不适合控制同一虚拟机内多个线程对文件的访问”。在这个问题中,您可以看到FileLock是被建议的,因为两个不同的JVM想要独占地操作一个文件时,用例是不同的。所以,我认为FileLock不适合您的场景。谢谢Amudhan!这个解决方案看起来不错。但我还想检查是否可以通过文件锁定机制实现这一点。我已经更新了问题。请告诉我您的想法。@bharath,我对FileLock了解不多,但javadoc说“文件锁代表整个Java虚拟机持有。它们不适合控制同一虚拟机内多个线程对文件的访问”。在这个问题中,您可以看到FileLock是被建议的,因为两个不同的JVM想要独占地操作一个文件时,用例是不同的。因此,我认为FileLock不是适合您的场景的解决方案。