Как выполнить атомарную передачу файла SFTP с использованием JSch, чтобы файл не был доступен до завершения процесса записи?

1

Я написал небольшую программу Java, которая использует Jsch для передачи нескольких текстовых файлов на удаленный сервер. Так как отдельные файлы могут быть довольно большими, передача занимает до 20 секунд.

На удаленном сервере результирующий файл будет доступен (прочитан) в разные моменты времени, который я не контролирую. Я протестировал, чтобы скопировать файл во время передачи SFTP на сервере. Скопированный файл не имел полных данных, которые должны быть полными, поскольку он не был полностью доступен ко времени команды копирования.

Как я могу обеспечить доступ к файлу только после того, как передача полностью завершена, так что файл может быть прочитан полностью? Поскольку я не могу контролировать доступ к файлу на удаленном сервере, мне нужен способ сделать это из моей программы Java.

Вот соответствующая часть кода, который я написал:

InputStream contentInputStream = null;
try {
    contentInputStream = new ByteArrayInputStream(Files.readAllBytes(Paths.get("test1.txt")));
} catch (IOException e) {
    e.printStackTrace();
}
sftpChannel.put(contentInputStream, "abc.txt");
Теги:
jsch
sftp

3 ответа

2
Лучший ответ

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

Тот, кто создал эту систему, должен был спроектировать ее с учетом этой проблемы. Для передачи файлов между серверами требуется время, а также передача может также завершиться до их завершения. Должен быть разработан способ передачи файлов на сервер, а затем сделать их доступными для этого удаленного процесса.

Существует три общих способа сделать это:

Запишите файл в другую папку: запишите файл в "временный" или "рабочий" каталог на удаленном сервере, который не контролируется удаленным процессом. По завершении передачи файла переместите файл из временного каталога в фактический целевой каталог. Перенос файла из одного каталога в другой должен быть мгновенной. SFTP позволяет перемещать файлы из одного каталога в другой на удаленном сервере.

Запишите файл в специальное имя файла: запишите файл в целевой каталог в удаленной системе, но используйте специальное имя файла, которое будет игнорировать удаленный процесс. По завершении передачи файла переименуйте файл, чтобы иметь правильное имя. Например, если удаленный процесс ищет имена файлов, заканчивающиеся на ".xml", вы должны создать файл с именем "foo.xml.tmp" на удаленном сервере, записать на него свои данные, а затем переименовать его из " foo.xml.tmp "в" foo.xml ". SFTP позволяет переименовывать файлы на удаленном сервере.

Использовать временные метки модификации: удаленный процесс может проверять временную метку с последними изменениями в файлах, которые она собирается обработать, и игнорировать файлы, которые были изменены в последнюю минуту или около того. Это поведение должно быть встроено в удаленный процесс. SFTP выполняет операцию по установке временной метки изменения в удаленном файле, и ее поддерживает АОН, но вы обычно не вызывали эту функцию явно. Как правило, вы будете зависеть от временной метки удаленного файла, которая будет отображаться в файле.

1

Ты не можешь.

Доступ к файлу на удаленном сервере - это просто "вещь удаленного сервера". Если какое-либо приложение SFTP-сервера не помечает файл как недоступный, оно по умолчанию доступно.

Вы можете установить такие разрешения по умолчанию почти во всех приложениях SFTP-сервера, о которых я знаю, так что это решение, которое вы должны искать.

Полностью неправильный ответ я дал... оставив его для "регистрации".

Ответ - метод sftp.chmod(). Вы можете отобрать весь доступ к файлу до его загрузки.

  • 0
    chmod может работать или не работать, поэтому ваш первоначальный ответ, как правило, более правильный, чем вариант с chmod. Особенно с учетом того, что chmod должен быть выполнен для файла, который уже существует, а OP ищет атомарную операцию загрузки.
  • 0
    Возможно, но теперь это там. :)
Показать ещё 1 комментарий
0

Протокол SFTP поддерживает явное блокирование только с версии 5. Хотя JSch поддерживает только версию 3 протокола (а также большинство серверов).

Таким образом, вы должны взломать его как-то по своему усмотрению. Например, например, @Xabster.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню