2017-11-23 12 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ですが、

関連する問題