【发布时间】: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