8

JSch ライブラリを使用して、SFTP サーバーからファイルを一覧表示およびダウンロードしています。

Channel channel = this.session.openChannel(SFTP_CHANNEL_NAME);
channel.connect();
sftpChannel = (ChannelSftp) channel;
Vector<LsEntry> 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)が、これはリモートサーバーへの接続中にのみタイムアウトを設定します。

4

3 に答える 3

9

コマンドがスタックしないようにする正しい方法は、セッションで 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;
  }
于 2013-11-06T12:21:02.013 に答える
2

ソースコードを確認するjschと、できないようです。しかし、結局のところオープンソースなので、これを実装できるはずです。のストリームの初期化を見てくださいChannelSftp.start。カスタマイズ可能なタイムアウトを使用して、独自の実装をハックインできます。

于 2013-05-15T08:00:51.540 に答える
0

javadoc はミリ単位で表示されていますが、実際には数秒で機能していると思います。 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 秒でタイムアウトします

于 2017-01-24T00:04:10.053 に答える