Настройка тайм-аута для операций JSch ChannelSftp

Я использую библиотеку JSch для просмотра и загрузки файлов с сервера SFTP.

Channel channel = this.session.openChannel(SFTP_CHANNEL_NAME);
channel.connect();
sftpChannel = (ChannelSftp) channel;
Vector<LsEntry> listing = sftpChannel.ls("*");

При вызове ls поток приложения иногда застревает.

Дамп резьбы -

Thread 15108: (state = BLOCKED)
java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
java.io.PipedInputStream.read() @bci=142, line=310 (Compiled frame)
java.io.PipedInputStream.read(byte[], int, int) @bci=43, line=361 (Compiled frame)
com.jcraft.jsch.ChannelSftp.fill(byte[], int, int) @bci=17, line=2527 (Compiled frame)
com.jcraft.jsch.ChannelSftp.header(com.jcraft.jsch.Buffer, com.jcraft.jsch.ChannelSftp$Header) @bci=12, line=2553 (Interpreted frame)
com.jcraft.jsch.ChannelSftp.ls(java.lang.String) @bci=298, line=1424 (Interpreted frame)

Есть ли способ настроить тайм-аут для ls и других методов? Я видел установку тайм-аута на channel.connect(timeout), но это устанавливает тайм-аут только при подключении к удаленному серверу.


person vivek garg    schedule 14.05.2013    source источник


Ответы (3)


Правильный способ предотвратить залипание команд - установить serverAliveInterval в сеансе. Из исходного кода:

  /**
   * Sets the interval to send a keep-alive message.  If zero is
   * specified, any keep-alive message must not be sent.  The default interval
   * is zero.
   * @param interval the specified interval, in milliseconds.
   * @see #getServerAliveInterval()
   */
  public void setServerAliveInterval(int interval) throws JSchException {
    setTimeout(interval);
    this.serverAliveInterval=interval;
  }
person Andreas    schedule 06.11.2013

Проверяя jsch исходный код, не похоже, что это возможно. Но в конце концов, это открытый исходный код, вы сможете это реализовать. Взгляните на инициализацию потоков в ChannelSftp.start. Вы можете взломать свою собственную реализацию с настраиваемыми таймаутами.

person Martin Prikryl    schedule 15.05.2013

Хотя javadoc говорит в миллисекундах, я думаю, что на самом деле он работает за секунды. https://epaul.github.io/jsch-documentation/simple.javadoc/com/jcraft/jsch/Session.html#setServerAliveInterval-int-.

            ChannelSftp sftpChannel = (ChannelSftp)session.openChannel("sftp");
            sftpChannel.connect();
            System.out.println("SFTP Channel created.");        
            session.setServerAliveInterval(3);
            filelist = (Vector<ChannelSftp.LsEntry>) sftpChannel.ls("*");

Этот код работает, как ожидалось, и время ожидания истекает через 3 секунды.

person salish    schedule 24.01.2017
comment
В моей версии 0.1.53 параметр setServerAliveInterval интерпретируется, как указано в документации, в миллисекундах. - person bskp; 22.06.2017