Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Configuring timeout on JSch ChannelSftp operations

Tags:

java

sftp

jsch

I am using JSch library to list and download files from a SFTP server.

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

While calling ls, application thread is getting stuck sometimes.

Thread dump -

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)

Is there a way to configure timeout on ls and other methods? I saw setting timeout on channel.connect(timeout) but this only sets the timeout while connecting to remote server.

like image 482
vivek garg Avatar asked May 14 '13 14:05

vivek garg


2 Answers

The correct way to do prevent commands from sticking is to set serverAliveInterval on the session. From the sourcecode:

  /**
   * 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;
  }
like image 103
Andreas Avatar answered Oct 20 '22 23:10

Andreas


Checking the jsch source code, it does not look like it is possible. But it's open source after all, you should be able to implement this. Take a look at initialization of streams in ChannelSftp.start. You can hack-in your own implementation with customizable timeouts.

like image 39
Martin Prikryl Avatar answered Oct 20 '22 23:10

Martin Prikryl