在JSch ChannelSftp操作上配置超时

viv*_*arg 6 sftp jsch

我正在使用JSch库列出和下载SFTP服务器上的文件.
Channel channel = this.session.openChannel(SFTP_CHANNEL_NAME);
channel.connect();
sftpChannel = (ChannelSftp) channel;
Vector 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)但这只在连接到远程服务器时设置超时.

And*_*eas 6

防止命令粘滞的正确方法是在会话中设置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;
  }
Run Code Online (Sandbox Code Playgroud)


Mar*_*ryl 2

查了一下jsch源码,好像不太可能。但它毕竟是开源的,你应该能够实现它。看一下 中流的初始化ChannelSftp.start。您可以使用可自定义的超时来侵入您自己的实现。