Обновить символическую ссылку без удаления в Java - PullRequest
1 голос
/ 10 июля 2019

Мне было интересно, есть ли способ обновить цель символической ссылки, не удаляя старую символическую ссылку.

У меня есть два фрагмента кода, что происходит одновременно.Первая часть загружает некоторые данные каждый час и сохраняет их в /some/directory, а также создает символическую ссылку /most/recent/data, указывающую на недавно загруженные данные.

Вторая часть будет считывать самые последние данные изsymlink /most/recent/data.

Ниже моя текущая реализация для создания символической ссылки.Но проблема в том, что если мы удалим исходную символическую ссылку, это вызовет проблемы, если мы будем читать с нее одновременно.Есть ли способ обновить цель символической ссылки, не удаляя старую символическую ссылку?

private void createSymLink(String symLinkPath, Path basePath) {
    try {
        Files.deleteIfExists(Paths.get(symLinkPath));
        Files.createSymbolicLink(Paths.get(symLinkPath), basePath);
    } catch (IOException e) {
    }
}

Я думаю, я только что нашел какое-то возможное решение.Создайте символическую ссылку tmp, а затем переместите ее на старую.Поскольку перемещение является атомарной операцией, обновление символической ссылки также будет атомарным.

private void createSymLink(String symLinkPath, Path basePath) {
    try {
        String tmpLink = "/tmp/tmpdir";
        Files.createSymbolicLink(Paths.get(tmpLink), basePath);
        Files.move(Paths.get(tmpLink), Paths.get(symLinkPath), ATOMIC_MOVE);
    } catch (IOException e) {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...