gpt4 book ai didi

java new File() 卡在陈旧的 NFS 挂载点上

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:43 24 4
gpt4 key购买 nike

在我的 java 代码中,我正在读取一个 NFS 挂载目录(代码在 NFS 客户端 机器上运行)。只要 NFS 服务器机器启动并运行,一切都很好,但是当 NFS 服务器关闭时(出于任何原因),代码卡在任何创建新文件到 nfs 安装目录的地方。如果我简单地卸载 nfs 目录,我的代码运行没有问题,但我不想每天手动检查这样的问题,只想在我的代码中处理这种情况

这是 NFS 服务器的/etc/exports:

/var/nfs/general *(rw,insecure,all_squash,no_subtree_check)

实际的java代码很简单:

log.info("before new");
File file = new File("/var/nfs/general");
log.info("after new");

它只在日志文件中打印“before new”而不会打印“after new”

我将新文件放入 Executor 服务中,并像建议的那样超时,但即使超时 2 秒仍会挂起:

How do I call some blocking method with a timeout in Java?

  • 操作系统:两台服务器(NFS 客户端和服务器)上的 ubuntu 服务器 16.04

    Java 版本:1.8_172

最佳答案

您可以简单地将其包装在 Callable 下并使用 get() 和超时。下面是一个示例代码,如果结果(此处为文件)不可用,它会在 20 秒后超时!

FutureTask<File> futureFile = new  FutureTask<File>(new Callable<File>(){
public File call() throws Exception {
return new File(filePath);
}
});

futureFile.get(20, TimeUnit.SECONDS);

出于测试目的,我已将超时设置为 3 纳秒。在这种情况下,文件肯定会超时。

public static File readTimeOut(final String filePath, int timeOutInMillis) throws InterruptedException, ExecutionException, TimeoutException {
ExecutorService executor = Executors.newFixedThreadPool(1);
FutureTask<File> futureFile = new FutureTask<File>(new Callable<File>() {

public File call() throws Exception {
System.out.println("I am called");
return new File("/usr/mohamed");
}
});
executor.execute(futureFile);
return futureFile.get(3, TimeUnit.NANOSECONDS);
}

(保持一切简单。资源未正确关闭!)但这肯定可以用 FutureTask 处理。

关于java new File() 卡在陈旧的 NFS 挂载点上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54195839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com