13

以下のコードの実行が完了するとnetstat -a|grep sftp、開いている SFTP 接続が表示されます。また、JProfiler で開いている接続として表示されます。

channel.isConnected()finallyブロックでfalseが出力されます。私が途方に暮れているので、接続が閉じられていない理由はありますか?

public static void clean() {
    com.jcraft.jsch.ChannelSftp channel = null;
    try {
        channel = Helper.openNewTLSftpChannel();
        channel.connect();
        channel.cd(remoteFileDirectory);

        List<ChannelSftp.LsEntry> list = channel.ls("*." + fileType);
        for (ChannelSftp.LsEntry file : list) {
            String fileName = file.getFilename();
            DateTime fileDate = new DateTime(parseDateFromFileName(fileName));

            //if this file is older than the cutoff date, delete from the SFTP share
            if (fileDate.compareTo(cleanupCutoffdate) < 0) {
                channel.rm(fileName);
            }
        }
    } catch (Exception exception) {
        exception.printStackTrace();
    } finally {
        if (channel != null) {
            channel.disconnect();
            System.out.println(channel.isConnected());
        }
    }
}

以下に追加openNewTLSftpChannel()

public static ChannelSftp openNewSftpChannel(String privateKeyFileName, String password, String username, String host, int port)
        throws ConfigurationErrorException {

    JSch jsch = new JSch();
    File sftpPrivateFile = new File(privateKeyFileName);
    Channel channel;
    try {
        if (!sftpPrivateFile.canRead()) {
            throw new ConfigurationErrorException("File access error: " + sftpPrivateFile.getAbsolutePath());
        }
        jsch.addIdentity(sftpPrivateFile.getAbsolutePath(), password);
        Session session = jsch.getSession(username, host, port);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        channel = session.openChannel("sftp");
    } catch (JSchException jschException) {
        throw new ConfigurationErrorException("File access error: " + sftpPrivateFile.getAbsolutePath());
    }
    return (ChannelSftp) channel;
}
4

2 に答える 2

25

SFTPの JSCH のを見ると、セッションがどのように終了するかがわかります。

//setup Session here 
...
session.connect();
...


Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;

...run sftp logic...

//close sessions here
sftpChannel.exit();
session.disconnect();

接続と切断には 2 つの部分があることに気付くでしょう。Session オブジェクトと Channel オブジェクト。

私のコードでは、Session オブジェクトを使用して認証情報を設定し、Channel オブジェクトを使用して必要な sftp コマンドを実行します。

インスタンスでは、openNewSftpChannel メソッドで Session オブジェクトを作成していますが、決して閉じられないため、セッションは存続します。

詳細なコンテキストについては、例を確認してください。

于 2013-04-02T19:03:51.177 に答える