首页 > 解决方案 > 并发文件移动访问

问题描述

我有一个可执行的 jar 文件,它可以运行以处理源目录中的文件。当开始处理一个文件时,它被移动到一个“处理”目录中,最后移动到一个完成的目录中。

此可执行 jar 文件通过 cron 作业运行

我遇到的问题是可执行 jar 运行重叠,即一次运行尚未完成,第二次运行已开始。

因此,同时运行 2 个或更多可执行 jar 来处理来自同一源目录的文件。

这个想法是,一旦可执行 jar 运行将文件移动到“处理”目录中,该文件将不会对源目录中运行的另一个可执行 jar 可见。

但是,似乎有 2 个或更多可执行 jar 运行正在获取源目录中的文件并开始处理该文件。结果是只有一个可执行 jar 运行能够完成文件的处理,而其他认为对文件具有独占访问权限的 jar 运行失败,因为文件不再存在。

我正在使用 java.nio.file 包中的 Files 类中提供的 Files.move(srcPath, targetPath) 在目录之间移动文件。

关于如何确保一次只有一个可执行 jar 运行处理一个文件的任何建议?

谢谢

皮特

标签: javaconcurrency

解决方案


有关如何使用 java 锁定文件的好示例java.nio.channels.FileLock如果可能)

srcPath在处理之前对每个都进行独占锁定。

更一般地说,如上所述,确保只有您的程序运行的实例。创建一个特定的锁定文件,您从头到尾都拥有独占访问权限。tryLock()如果您无法获得它,请使用并退出(因为这意味着另一个实例已经拥有它)。


推荐阅读