2017-11-23 24 views
2

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(); 
    } 
+0

각 작업마다 별도의 세션/채널을 만드는 이유는 무엇입니까? –

+0

그렇다면 어디에서해야합니까? 생성자에서 의미합니까? 채널과 세션을 개인 속성으로 정의 할 수 있습니까? 그 접근 방식은 괜찮습니까? 아니면 다른 것을 제안하고 있습니까? – nanosoft

답변

0

을 지적했다. SSH/SFTP 연결을 여는 것은 클라이언트와 서버 모두를 요구하는 CPU입니다. 머지 않아 새 연결이 필요할 경우 연결을 종료하는 것이 좋습니다.

"응용 프로그램"의 시작 부분에서 단일 공유 세션과 채널을 열고 모든 작업에 다시 사용할 것을 고려하십시오.


는 실제 응답 세션 : 나는 ( getSession()getChannel() 같은 방법으로) 모두 SessionChannelSftp을 소유하는 다른 클래스를 소개하고, 팩토리 메소드에서 해당 돌려주세요.


실제로는 getSession method in the Channel class이 있습니다.