Мне было интересно, есть ли способ обновить цель символической ссылки, не удаляя старую символическую ссылку.
У меня есть два фрагмента кода, что происходит одновременно.Первая часть загружает некоторые данные каждый час и сохраняет их в /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) {
}
}