Java 将连接池与JSCH一起使用
我正在使用JSCH进行文件上传。在当前状态下,每个线程在需要时打开和关闭连接 是否可以将连接池与JSCH一起使用,以避免大量连接打开和关闭造成的开销 下面是一个从线程内部调用函数的示例Java 将连接池与JSCH一起使用,java,multithreading,connection-pooling,sftp,jsch,Java,Multithreading,Connection Pooling,Sftp,Jsch,我正在使用JSCH进行文件上传。在当前状态下,每个线程在需要时打开和关闭连接 是否可以将连接池与JSCH一起使用,以避免大量连接打开和关闭造成的开销 下面是一个从线程内部调用函数的示例 public static void file_upload(String filename) throws IOException { JSch jsch = new JSch(); Session session = null; try { session = jsc
public static void file_upload(String filename) throws IOException {
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("user", "server_name", 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("super_secre_password");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
FileInputStream inputSrr = new FileInputStream(filename);
try {
sftpChannel.put(inputSrr, "/var/temp/"+filename);
} catch (SftpException e) {
e.printStackTrace();
} finally {
if (inputSrr != null) {
inputSrr.close();
}
}
sftpChannel.exit();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
}
为此,我更愿意 下面是Ssh连接池的一个实现 您可以使用grep4j来使用此池
还要确保您可以从执行机器访问服务器。例如,如果目标服务器不在您的范围内。它将引发连接超时。我想与您分享我们的实现,我们使用了 首先,您需要实现池对象工厂,该工厂负责池对象的生命周期:
public class ChannelSftpConnectionsFactory extends BasePooledObjectFactory<ChannelSftp> {
private SessionManager sessionManager;
public ChannelSftpConnectionsFactory(final SessionManager sessionManager) {
this.sessionManager = sessionManager;
}
//Create and open channel
@Override
public ChannelSftp create() throws JSchException {
ChannelSftp channelSftp = (ChannelSftp) sessionManager.getSession().openChannel("sftp");
channelSftp.connect();
return channelSftp;
}
//wrapping
@Override
public PooledObject<ChannelSftp> wrap(final ChannelSftp channelSftp) {
return new DefaultPooledObject<>(channelSftp);
}
@Override
//disconnect channel on destroy
public void destroyObject(final PooledObject<ChannelSftp> pooledObject) {
ChannelSftp sftp = pooledObject.getObject();
disconnectChannel(sftp);
}
void disconnectChannel(final ChannelSftp sftp) {
if (sftp.isConnected()) {
sftp.disconnect();
}
}
@Override
//reset channel current folder to home if someone was walking on another folders
public void passivateObject(final PooledObject<ChannelSftp> p) {
ChannelSftp sftp = p.getObject();
try {
sftp.cd(sftp.getHome());
} catch (SftpException ex) {
log.error("Could not reset channel to home folder, closing it");
disconnectChannel(sftp);
}
}
@Override
//validate object before it is borrowed from pool. If false object will be removed from pool
public boolean validateObject(final PooledObject<ChannelSftp> p) {
ChannelSftp sftp = p.getObject();
return sftp.isConnected() && !sftp.isClosed();
}
}
这对你有帮助吗?我问你,因为stackoverflow是建立在声誉评分系统上的。我正忙于其他项目,所以没有时间尝试。我一试就告诉你。你能分享一下你是如何实现它的吗?@xmlParser我添加了简单的实现,如果你需要更多细节,请随时问我。我将添加更多关于如何配置池以及如何使用池的信息。由于不再维护grep4j,该实现将在较新版本的java上导致类路径问题
ObjectPool<ChannelSftp> createPool(final SessionManager sessionManager, final GenericObjectPoolConfig<ChannelSftp> poolConfig) {
return PoolUtils.synchronizedPool(new GenericObjectPool<>(buildFactory(sessionManager), poolConfig));
}
PooledObjectFactory<ChannelSftp> buildFactory(final SessionManager sessionManager) {
return PoolUtils.synchronizedPooledFactory(new ChannelSftpConnectionsFactory(sessionManager));
}
Object obj = null;
try {
obj = pool.borrowObject();
try {
//...use the object...
} catch(Exception e) {
// invalidate the object
pool.invalidateObject(obj);
// do not return the object to the pool twice
obj = null;
} finally {
// make sure the object is returned to the pool
if(null != obj) {
pool.returnObject(obj);
}
}
} catch(Exception e) {
// failed to borrow an object
}