JSch «труба закрыта» при использовании SFTP загрузки InputStream после отключения - PullRequest
2 голосов
/ 10 июля 2020

Я использую JSch, чтобы открыть канал SFTP на удаленный сервер. Я использую приведенный ниже код, чтобы открыть соединение и загрузить файл:

public org.springframework.core.io.Resource download(){
    JSch jsch = new Jsch();
    Session session = jsch.get("root", "192.168.1.10", 22);
    session.setPassword("root");
    session.setConfig("StrictHostKeyChecking","no");
    session.connect();
    ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
    channelSftp.connect();
    InputStream is = channelSftp.get("/root/example.mp4");
    channelSftp.exit();
    session.disconnect();
    return new org.springframework.core.io.InputStreamResource(is);    
}

Проблема:

  1. Если я использую метод exit() и / или disconnect(), будет выбрано Pipe closed исключение
  2. Если я этого не сделаю, мой метод успешно вернет Resource, но канал / сеанс все еще находится в состоянии connected.

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

Дополнительно

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Вы не можете получить доступ к данным после отключения.

Если API требуется InputStream, а затем вы потеряете управление, вы можете реализовать реализацию оболочки InputStream, которая делегирует все вызовы вашему is , и вызывает disconnect один раз InputStream.close вызывается.

1 голос
/ 10 июля 2020

Вы не должны читать из входного потока после вызова disconnect (). Либо сначала прочтите данные из потока, а затем вызовите функцию disconnect (), либо используйте channelSftp.get (sourceDir, destinationDir) , чтобы загрузить файл в локальный каталог назначения в локальной файловой системе, прежде чем вызывать Disconnect ().

...