SFTP 용 JSch 라이브러리를 사용하고 있습니다. 다른 디렉토리에서 원격 파일을 이동하거나 파일을 가져 오는 것과 같은 SFTP 서버에서 몇 가지 작업을 수행해야합니다. 이러한 모든 작업을 수행하려면 Session
이 필요하고 Channel
을 얻은 다음 ChannelSftp
으로 전송하십시오. 이것은 중복 단계입니다. 그래서 나는 그것을 private
메쏘드로 추상화하려고 생각했습니다. JSch 라이브러리를 사용하여 Java에서 세션 및 SFTP 채널 얻기
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;
}
호출 방법 예 :-는 중복 된 코드가 자주 충분히 SFTP 세션을 사용하는 경우, 당신은 모든 작업을 위해 그것을 다시는 안
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();
}
각 작업마다 별도의 세션/채널을 만드는 이유는 무엇입니까? –
그렇다면 어디에서해야합니까? 생성자에서 의미합니까? 채널과 세션을 개인 속성으로 정의 할 수 있습니까? 그 접근 방식은 괜찮습니까? 아니면 다른 것을 제안하고 있습니까? – nanosoft