Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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 并发文件移动访问_Java_Concurrency - Fatal编程技术网

Java 并发文件移动访问

Java 并发文件移动访问,java,concurrency,Java,Concurrency,我有一个可执行的jar文件,它运行到源目录中的处理文件。 当开始处理一个文件时,它会被移动到一个处理目录中,最后被移动到一个完整的目录中 此可执行jar文件通过cron作业运行 我遇到的问题是,可执行jar运行是重叠的,即一次运行尚未完成,第二次运行已开始 因此,有2个或更多的可执行jar同时运行,以处理来自同一源目录的文件 其思想是,一旦可执行jar运行将文件移动到处理目录中,源目录中的另一个可执行jar运行将看不到该文件 但是,似乎有2个或更多的可执行jar运行正在获取源目录中的文件并开始处

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

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

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

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

其思想是,一旦可执行jar运行将文件移动到处理目录中,源目录中的另一个可执行jar运行将看不到该文件

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

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

关于如何确保一次只运行一个可执行jar进程来处理一个文件,有什么建议吗

多谢各位

Pete

有关java.nio.channels.FileLock的良好示例,请参阅

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


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

是否可以确保只有一个jar正在运行?所以当一个jar检测到另一个正在运行时,它就停止了?你可以为此创建一个锁文件。简单有效。考虑使用FileChannel=FileChannel.openpath;FileLock lock=channel.tryLock。这是一个好方法还是有更好的方法?谢谢,抱歉,回复有点晚。。我得睡一会儿。是否可能获得文件夹的独占锁定?如果可以,请提供一个示例。我这样问是因为可执行jar运行在不同的服务器上,但正在访问一个共享源文件夹来处理文件。如果有这样一种机制,解决方案将意味着,每个可执行jar运行都将尝试锁定源文件夹。如果没有中止,则处理文件。这种方式确保在任何时候只有一个可执行jar运行在实际处理文件。再次感谢您这听起来不再像Java问题了。您有两台主机共享一些文件系统。这完全取决于所涉及的技术,即是否可以锁定该FS。最后一个基本选项是使每个进程的targetPath不同。两者都可能尝试将文件A从公共src/A->processing-/A移动,但只有一个可以成功。