java новый файл () висит на устаревшей точке монтирования NFS - PullRequest
0 голосов
/ 15 января 2019

В моем Java-коде я читаю смонтированный каталог NFS (код работает на NFS client машине). Все в порядке, пока компьютер с NFS работает и работает, но когда сервер NFS не работает (по любой причине), код зависает везде, где создается новый файл в каталог, смонтированный на nfs. Если я просто размонтирую каталог nfs, мой код запускается без проблем, но я не хочу вручную проверять такие проблемы каждый день и хотел бы обработать этот сценарий только в моем коде

это / etc / export сервера NFS:

/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");

Он печатает только «до нового» в файле журнала и никогда не достигает «после нового» * ​​1012 *

Я поместил новый файл в службу Executor с тайм-аутом, как это было предложено, но все еще зависает даже с 2-секундным таймаутом:

Как вызвать какой-либо метод блокировки с таймаутом в Java?

  • ОС: Ubuntu Server 16.04 на обоих серверах (NFS-клиент и сервер)

    Java-версия: 1.8_172

1 Ответ

0 голосов
/ 15 января 2019

Вы можете просто обернуть его в 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.

...