【问题标题】:Getting session and SFTP channel in Java using JSch library使用 JSch 库在 Java 中获取会话和 SFTP 通道
【发布时间】:2017-11-23 09:28:14
【问题描述】:

我正在为 SFTP 使用 JSch 库。我需要在 SFTP 服务器上执行多项操作,例如在其他目录中移动远程文件、拉取文件等。对于所有这些操作,我需要 Session 并从中获得 Channel 然后将其转换为 ChannelSftp。这是多余的步骤。所以我想把它抽象成一个private方法。

private ChannelSftp getChannelSftp() throws JSchException
    {
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();
        Session session;
        session = jsch.getSession(VENDOR1_USERID, VENDOR1_SERVER, VENDOR1_PORT);
        session.setPassword(VENDOR1_PASSWORD);

        session.setConfig(config);
        session.connect();

        ChannelSftp channelSftp = null;

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

        return channelSftp;
    }

但在 SFTP 操作之后,我需要断开与频道和会话两者的连接。 使用上述方法,虽然我可以在调用方法中断开与Channel 的连接,但我无法与Session 断开连接,因为我没有它可能是泄漏的实例,所以我现在将其分离为getSession() 方法和现在ChannelSftp 创建在所有方法中都重复了。

设计/重构有什么更好的方法?

private Session getSession() throws JSchException
    {
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();
        Session session;
        session = jsch.getSession(VENDOR1_USERID, VENDOR1_SERVER, VENDOR1_PORT);
        session.setPassword(VENDOR1_PASSWORD);
        session.setConfig(config);
        session.connect();
        return session;
    }

调用方法示例: - 显示重复代码

public void sftp(File file) throws  SftpException, FileNotFoundException, JSchException
    {
        Session session = getSession();
/* Duplicate code START*/
        if ( session == null ) throw new SftpException(0 , "Service: Session is NULL"); 

        ChannelSftp channelSftp = null;

        Channel channel = session.openChannel("sftp");
        channel.connect();
        channelSftp = (ChannelSftp) channel;
/* Duplicate code END*/
        channelSftp.cd(VENDOR1_PATH);
        channelSftp.put(new FileInputStream(file), file.getName());

        channelSftp.disconnect();
        session.disconnect();
    }

【问题讨论】:

    标签: java refactoring sftp jsch code-duplication


    【解决方案1】:

    如果您足够频繁地使用 SFTP 会话,则不应为每个操作重新创建它。打开 SSH/SFTP 连接对客户端和服务器的 CPU 要求都很高。如果您很快需要一个新连接,那么关闭连接是一种浪费。

    因此,请考虑在您的“应用程序”开始时打开一个共享会话和通道,并将其重用于所有操作。


    回答您的实际会话:我将介绍另一个同时拥有 SessionChannelSftp 的类(使用像 getSession()getChannel() 这样的方法)并从工厂方法返回它。


    虽然实际上,有getSession method in the Channel class

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      相关资源
      最近更新 更多