原子移动和许多进程同时运行它

Pio*_*aza 5 java nio

在我的应用程序中,我已安排监视目录以查找具有特定扩展名的文件的任务.这些文件将被进一步处理.可以有多个进程执行此应用程序并防止多个实例处理相同的文件我更改其扩展名,因此未使用Files.movewith ATOMIC_MOVE选项列出其他时间.有可能不止一个app实例同时尝试执行此方法 - 我的问题是:接下来会发生什么?我应该期待抛出一些异常吗?

Hug*_* M. 4

您应该能够指望正确的行为:第一个“获胜”,第二个获得java.nio.file.NoSuchFileException,因此您捕获该特定异常并忽略该文件。

try {
    Files.move(previousPath, renamedPath, StandardCopyOption.ATOMIC_MOVE);
}
catch (NoSuchFileException e) {
    /* Another process has already processed that file. Ignore and move on. */
}
catch (IOException e) {
    /* Must handle that one: something else has failed */
}
Run Code Online (Sandbox Code Playgroud)

我已经在 Linux 和 macOS 上验证了一个程序,该程序列出了包含一些文件的目录,并使用随机 UUID 重命名它们,并在同一目录上运行该程序的多个实例一段时间。我得到了很多NoSuchFileException,但没有其他的了。

我对此在本地文件系统上非常有信心。但是,如果您在网络文件系统(NFS...)上使用它,那么所有的赌注都会被取消。