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