java - 并发文件移动访问
问题描述
我有一个可执行的 jar 文件,它可以运行以处理源目录中的文件。当开始处理一个文件时,它被移动到一个“处理”目录中,最后移动到一个完成的目录中。
此可执行 jar 文件通过 cron 作业运行
我遇到的问题是可执行 jar 运行重叠,即一次运行尚未完成,第二次运行已开始。
因此,同时运行 2 个或更多可执行 jar 来处理来自同一源目录的文件。
这个想法是,一旦可执行 jar 运行将文件移动到“处理”目录中,该文件将不会对源目录中运行的另一个可执行 jar 可见。
但是,似乎有 2 个或更多可执行 jar 运行正在获取源目录中的文件并开始处理该文件。结果是只有一个可执行 jar 运行能够完成文件的处理,而其他认为对文件具有独占访问权限的 jar 运行失败,因为文件不再存在。
我正在使用 java.nio.file 包中的 Files 类中提供的 Files.move(srcPath, targetPath) 在目录之间移动文件。
关于如何确保一次只有一个可执行 jar 运行处理一个文件的任何建议?
谢谢
皮特
解决方案
有关如何使用 java 锁定文件的好示例java.nio.channels.FileLock
(如果可能)
srcPath
在处理之前对每个都进行独占锁定。
更一般地说,如上所述,确保只有您的程序运行的实例。创建一个特定的锁定文件,您从头到尾都拥有独占访问权限。tryLock()
如果您无法获得它,请使用并退出(因为这意味着另一个实例已经拥有它)。
推荐阅读
- laravel-7 - 调用模型 [App\Product] 上的未定义关系 [类别]
- javascript - 多个按钮 - for 循环不会执行,所以按钮不起作用 - javascript
- python - curses.getstr 具有预先填充的值
- android - 找不到 com.android.tools.build:gradle:6.5
- python - 如何用其他字典中存在的某些值替换字典中的占位符?
- python - Python dict解包运算符不在构造函数中解包字符串
- r - 如何识别不合逻辑的字符串/句子
- python-3.x - 如何从表格数据中获取数据然后打印一条消息
- 3d - gnuplot:如何避免依赖视角的半透明 3D 表面?
- javascript - 如何在角度中的每 2 个字符后自动插入/添加冒号 (:)