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

时间:2017-06-25 18:19:57

标签: java nio

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

1 个答案:

答案 0 :(得分:2)

你应该能够指望一个正确的行为:第一个获胜,第二个得到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 */
}

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

我对本地文件系统非常有信心。但是,如果您在网络文件系统(NFS ...)上使用它,则所有投注均已关闭。