2013-05-14 156 views
5

我正在使用JSch庫列出並從SFTP服務器下載文件。
Channel channel = this.session.openChannel(SFTP_CHANNEL_NAME);
channel.connect();
sftpChannel = (ChannelSftp) channel;
Vector listing = sftpChannel.ls("*");
在JSch ChannelSftp操作上配置超時

在調用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)上看到了設置超時,但這隻會在連接到遠程服務器時設置超時。

回答

1

檢查jsch源代碼,它看起來不可能。但畢竟它是開源的,你應該可以實現這一點。看看ChannelSftp.start中流的初始化。你可以用自定義的超時時間來破解你自己的實現。

4

防止命令粘連的正確方法是在會話上設置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; 
    } 
0

儘管javadoc在millis中說,我認爲它實際上在幾秒鐘內工作。 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秒內

+0

以我的版本,這是0.1.53,參數超時'如在該文檔中指定setServerAliveInterval'被解釋,在**毫秒**。 – bskp 2017-06-22 06:49:27