使用 JSch 库在 Java 中获取会话和 SFTP 通道



我正在使用JSch库进行SFTP。我需要在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();
}

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

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


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


虽然实际上,Channel类中有getSession方法。

最新更新