在我的Java代码中,我正在读取NFS挂载的目录(代码在NFS client
机器上运行)。只要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 after new”
我将新文件置于Executor服务中,并按建议的超时时间进行超时,但即使2秒超时仍然挂起:
How do I call some blocking method with a timeout in Java?
操作系统:两台服务器(NFS客户端和服务器)上的ubuntu服务器16.04
Java版本:1.8_172
答案 0 :(得分:0)
您可以简单地将其包装在Callable下,并使用带有超时的get()。下面是一个示例代码,如果result(此处的文件)不可用,可能会在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 ns。在这种情况下,文件肯定会超时。
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处理。