2013-05-14 17 views
5

Bir SFTP sunucusundan dosyaları listelemek ve indirmek için JSch kitaplığı kullanıyorum.
Channel channel = this.session.openChannel(SFTP_CHANNEL_NAME);
channel.connect();
sftpChannel = (ChannelSftp) channel;
Vector listing = sftpChannel.ls("*");
JSch ChannelSftp işlemlerinde zaman aşımı yapılandırma

ls numaralı telefonu ararken, uygulama iş parçacığı bazen takılıyor.

Konu dökümü -
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 ve diğer yöntemler üzerinde zaman aşımını yapılandırmak için bir yolu var mı? channel.connect(timeout) ayar zaman aşımı gördüm, ancak bu sadece uzak sunucuya bağlanırken zaman aşımı ayarlar.

cevap

1

jsch kaynak kodunun kontrol edilmesi, mümkün görünmüyor. Ama sonuçta açık kaynak, bunu uygulayabilmelisiniz. ChannelSftp.start'da akışların başlatılmasına bakın. Özelleştirilebilir zaman aşımları ile kendi uygulamanıza girebilirsiniz.

4

Komutların yapışmasını önlemek için doğru yol, oturumda sunucuAliveInterval ayarını yapmaktır. Kaynak kodundan:

/** 
    * 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

Her ne kadar javadoc millis'te yazıyorsa da sanırım gerçekten saniyeler içinde çalışıyorum. 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("*"); 

Bu kod ** beklenen ve zamanlama: 3 saniye 0.1.53 parametre benim versiyonunda,

+0

olarak dokümanlar belirtildiği gibi 'setServerAliveInterval', yorumlanır çalışıyor ** milisaniye. – bskp