JAVA: - Обмен файлами и блокировка между несколькими Java приложениями не работают в Linux - PullRequest
0 голосов
/ 14 июля 2020

У меня два отдельных процесса Java. Произнесите AB C и DEF. DEF является дочерним для AB C (то есть DEF создается AB C. И AB C, и DEF порождаются с использованием двух файлов jar AB c .jar и DEF.jar соответственно). Мое требование - сохранить файл, общий для AB C и DEF. Этот файл создан AB C и будет заблокирован. DEF проверяет, разблокирован ли файл. Если разблокировано, процесс DEF завершается. Это связано с проблемой сиротского процесса, в котором дочерний процесс не уничтожается при сбое родительского процесса.

Итак, в этом случае файл, созданный AB C, останется заблокированным до AB C выходит. DEF уже проверяет, снята ли блокировка файла. Поскольку условием для снятия блокировки является завершение AB C, DEF завершается, как только завершается AB C.

Итак, я создал класс FileLock. java в AB C процесс: -

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileLock;

public class FileLock {

    public FileLockExample() throws FileNotFoundException {
        FileOutputStream fileOutStream;
        try {
            fileOutStream= new FileOutputStream("Temp.txt");
            FileLock fileLock ;
            try {
                fileLock = fileOutStream.getChannel().tryLock();
                if (fileLock != null) {
                    System.out.println("Locked File");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {

            e.printStackTrace();
        }

    }
}

Итак, файл Temp.txt создан и заблокирован.

Теперь я добавил функцию в DEF, где я проверяю, заблокирован ли файл.

public static void isFileUnlocked() {
        Integer count = 1000;
        boolean isFirstTry = false;
        while (count > 0) {
            try {
                if (!isFirstTry) {
                    FileOutputStream fos = new FileOutputStream("Temp.txt");
                    FileLock fileLock = fos.getChannel().tryLock();
                    isFirstTry = true;
                }
                FileInputStream fis = new FileInputStream("Temp.txt");
                fis.read();
                System.exit(0);
            } catch (IOException x) {

            }
          Thread.sleep(1000);
          count--;
        }
    }

Функция isFileUnlocked () в процессе DEF проверяет, снимается ли блокировка файла каждую секунду. Если блокировка снята, это означает, что AB C был отключен по каким-то причинам. Итак, DEF закрывается, как только снимается блокировка файла.

Я проверил это в Windows, и похоже, что он работает. Hwever, В Linux процесс DEF существует, как только вызывается функция isFileUnlocked (). Таким образом, когда DEF пытается прочитать файл, он может это сделать. (Это может означать, что файл разблокирован).

Есть мысли по этому поводу?

1 Ответ

0 голосов
/ 14 июля 2020

Предполагая, что [заблокированный] файл не закрывается при вызове метода checkIfFileIsUnlocked(), а также предполагая, что вы вызываете метод checkIfFileIsUnlocked() с правильным параметром, чтобы проверить, заблокирован ли файл, вам необходимо прочитать из файл. Простое открытие файла не вызовет исключение.

Это очень плохо написанный пример, но он просто предназначен для демонстрации того, как реализовать вашу проверку.


try {
    FileOutputStream fos = new FileOutputStream("lockfile.txt");
    FileLock fileLock = fos.getChannel().tryLock();

    FileInputStream fis = new FileInputStream("lockfile.txt");
    fis.read();
}
catch (IOException x) {
    x.printStackTrace();
}

При выполнении приведенного выше кода следующая строка вызывает исключение.

fis.read()

Исключение:

java.io.IOException: The process cannot access the file because another process has locked a portion of the file

...