2013-05-14 8 views
5

Ich verwende JSch-Bibliothek zum Auflisten und Herunterladen von Dateien von einem SFTP-Server.
Channel channel = this.session.openChannel(SFTP_CHANNEL_NAME);
channel.connect();
sftpChannel = (ChannelSftp) channel;
Vector listing = sftpChannel.ls("*");
Konfigurieren der Zeitüberschreitung bei JSch ChannelSftp-Operationen

Während Aufruf ls, Anwendung Thread manchmal stecken bleibt.

Thema 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)

Gibt es eine Möglichkeit Timeout auf ls und anderen Methoden zu konfigurieren? Ich sah Einstellung Timeout auf channel.connect(timeout), aber dies legt nur die Zeitüberschreitung beim Herstellen einer Verbindung zum Remote-Server.

Antwort

1

Überprüfen Sie den jsch Quellcode, es sieht nicht wie es möglich ist. Aber es ist schließlich Open Source, Sie sollten in der Lage sein, dies zu implementieren. Werfen Sie einen Blick auf die Initialisierung von Streams in ChannelSftp.start. Sie können Ihre eigene Implementierung mit anpassbaren Timeouts hacken.

4

Die korrekte Vorgehensweise zum Verhindern, dass Befehle hängen bleiben, besteht darin, serverAliveInterval für die Sitzung festzulegen. Aus dem Quellcode:

0

Obwohl Javadoc in Millis sagt, ich denke, es funktioniert tatsächlich in Sekunden. 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("*"); 

Dieser Code arbeitet in 3 Sekunden

+0

In meiner Version wie erwartet und das Timing aus, die 0.1.53, der Parameter 'setServerAliveInterval' in der Dokumentation als angegeben interpretiert wird, in ** Millisekunden **. – bskp