ssh 看apache

我发现org.apache.commons.pool非常有用且健壮,但没有充分记录。 因此,我将在这里帮助您解释如何使用Apache KeyedObjectPool 什么是KeyedObjectPool ? 它是一个映射,其中包含多种类型的实例池。 可以使用任意键访问每种类型。 在此示例中,我将创建一个JSch ssh连接池,并将使用一个名为ServerDetails的简单getter setter对象作为键。 基本上,对于每个服务器,我希望有10个可重用的ssh连接池。 因此,首先要做的是创建一个Sessionfactory,一个负责创建要存储在池中的实际对象的类。 在我们的示例中,这将是ssh连接。

Sessionfactory需要扩展BaseKeyedPoolableObjectFactory <K,V>,其中K是此池中键的类型, V是此池中保存的对象的类型。 All you need to do is implement the makeObject方法, All you need to do is implement the方法需要在池中实际创建对象,而destroyObject显然需要在释放对象并将其放回池中时实现代码。

package org.grep4j.core.command.linux;
import org.apache.commons.pool.BaseKeyedPoolableObjectFactory;
import org.grep4j.core.model.ServerDetails;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;
/*** This class is used to handle ssh Session inside the pool.* * @author Marco Castigliego**/
public class SessionFactory extends BaseKeyedPoolableObjectFactory<ServerDetails, Session> {/*** This creates a Session if not already present in the pool.*/@Overridepublic Session makeObject(ServerDetails serverDetails) throws Exception {Session session = null;try {JSch jsch = new JSch();session = jsch.getSession(serverDetails.getUser(), serverDetails.getHost(), serverDetails.getPort());session.setConfig('StrictHostKeyChecking', 'no'); // UserInfo userInfo = new JschUserInfo(serverDetails.getUser(), serverDetails.getPassword());session.setUserInfo(userInfo);session.setTimeout(60000);session.setPassword(serverDetails.getPassword());session.connect();} catch (Exception e) {throw new RuntimeException('ERROR: Unrecoverable error when trying to connect to serverDetails :  ' + serverDetails, e);}return session;}/*** This is called when closing the pool object*/@Overridepublic void destroyObject(ServerDetails serverDetails, Session session) {session.disconnect();}
}

您需要做的第二件事是创建实际的密钥池对象。 在我们的示例中,我们创建一个拥有StackKeyedObjectPool的单例。 数字10是池中“睡眠”实例数量的上限。 如果11个客户端尝试为同一服务器获取ssh连接,则第11个客户端将等待,直到前10个客户端之一释放其连接。

package org.grep4j.core.command.linux;
import org.apache.commons.pool.KeyedObjectPool;
import org.apache.commons.pool.impl.StackKeyedObjectPool;
import org.grep4j.core.model.ServerDetails;
import com.jcraft.jsch.Session;
/*** Pool controller. This class exposes the org.apache.commons.pool.KeyedObjectPool class.* * @author Marco Castigliego**/
public class StackSessionPool {private KeyedObjectPool<ServerDetails, Session> pool;private static class SingletonHolder {public static final StackSessionPool INSTANCE = new StackSessionPool();}public static StackSessionPool getInstance() {return SingletonHolder.INSTANCE;}private StackSessionPool(){startPool();}/*** * @return the org.apache.commons.pool.KeyedObjectPool class*/public KeyedObjectPool<ServerDetails, Session> getPool() {return pool;}/*** * @return the org.apache.commons.pool.KeyedObjectPool class*/public void startPool() {pool = new StackKeyedObjectPool<ServerDetails, Session>(new SessionFactory(), 10);}
}

如何使用它,简单明了。 要从池中获取ssh连接,我们只需要调用:

StackSessionPool.getInstance().getPool().borrowObject(serverDetails)

其中,serverDetails是我们的关键(我们需要每个服务器的ssh连接池)。

当不再需要连接时,我们使用以下命令将其放回池中:

StackSessionPool.getInstance().getPool().returnObject(serverDetails, session);
package org.grep4j.core.command.linux;import org.grep4j.core.command.ExecutableCommand;
import org.grep4j.core.model.ServerDetails;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.Session;
/*** The SshCommandExecutor uses the net.schmizz.sshj library to execute remote* commands.* * <ol>* <li>Establish a connection using the credential in the {@link serverDetails}</li>* <li>Opens a session channel</li>* <li>Execute a command on the session</li>* <li>Closes the session</li>* <li>Disconnects</li>* </ol>* * @author Marco Castigliego* */
public class JschCommandExecutor extends CommandExecutor {public JschCommandExecutor(ServerDetails serverDetails) {super(serverDetails);}@Overridepublic CommandExecutor execute(ExecutableCommand command) {Session session = null;Channel channel = null;try {session = StackSessionPool.getInstance().getPool().borrowObject(serverDetails);//...do stuff} catch (Exception e) {throw new RuntimeException('ERROR: Unrecoverable error when performing remote command '+ e.getMessage(), e);} finally {if (null != channel && channel.isConnected()) {channel.disconnect();}if (null != session) {try {StackSessionPool.getInstance().getPool().returnObject(serverDetails, session);} catch (Exception e) {e.printStackTrace();}}}return this;}
}

请记住,当您不再需要使用PoolSessionPool.getInstance()。getPool()。close()时,关闭该池。

参考: 使用来自我们的JCG合作伙伴 Marco Castigliego的Apache KeyedObjectPool的ssh连接池,位于“ 删除重复和修复不良名称”博客中。

翻译自: https://www.javacodegeeks.com/2013/02/pool-of-ssh-connections-using-apache-keyedobjectpool.html

ssh 看apache

ssh 看apache_使用Apache KeyedObjectPool的ssh连接池相关推荐

  1. 使用Apache KeyedObjectPool的ssh连接池

    我发现org.apache.commons.pool非常有用且健壮,但没有充分记录. 因此,我将在这里帮助您解释如何使用Apache KeyedObjectPool . 什么是KeyedObjectP ...

  2. 用apache commons-pool2建立thrift连接池

    Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.具体的介绍可以看Apache的官方网站:http://thrift.apache.org/ . ...

  3. ssh是什么_【科普】SSH都不懂,还搞什么网络

    关注我,你的眼睛会怀孕 今天小编为大家分享一篇关于SSH 的介绍和使用方法的文章.本文从SSH是什么出发,讲述了SSH的基本用法,之后在远程登录.端口转发等多种场景下进行独立的讲述,希望能对大家有所帮 ...

  4. 【转】SSH中 整合spring和proxool 连接池

    [摘要:比来做的一个项目中应用到了毗邻池技巧,大概我们人人比拟认识的开源毗邻池有dbcp,c3p0,proxool.对那三种毗邻池来讲,从机能战失足率来讲,proxool轻微比前两种好些.本日我首要简 ...

  5. Linux常用传输协议ssh和scp tcp udp http https ssh

    Linux常用传输协议ssh和scp   tcp udp http https ssh 1,SSH ssh介绍 SSH为Secure Shell的缩写,由 IETF 的网络工作小组(Network W ...

  6. linux系统禁用ssh,怎么在Linux系统中禁用 SSH

    今天微子网络与你分享了如何在Linux系统中禁用SSH,微子网络认为这很实用,所以他分享给你学习.希望你看完这篇文章能有所收获.话不多说,让我们和微子网络一起看看 SSH是什么? Openssh叫做O ...

  7. Linux怎么关闭ssh和ftp服务,linux ftp启用和停用及vsftpd安装 ssh 启用和停用命令及ssh的安装...

    1.首页要用ftp:服务器上必须安装vsftpd 安装命令 yum installed vsftpd daokr# service vsftpd status ● vsftpd.service-vsf ...

  8. linux+添加git+ssh+keys,为github帐号添加SSH keys(Linux和Windows)(示例代码)

    一.Linux增加ssh keys方法: 使用git clone命令从github上同步github上的代码库时,如果使用SSH链接(如我自己的cofface_recovery项目:[email pr ...

  9. win10 linux ssh自动启动,win10子系统 wsl开机启动ssh服务

    win10子系统 wsl开机启动ssh服务 win10子系统 wsl开机启动ssh服务 一.安装ssh服务 说明:虽然已经安装了ssh服务,但是好像默认自带的不能用.所以需要先卸载再安装. 执行以下命 ...

最新文章

  1. Java实现自动生成Mysql数据库表实体类
  2. (J2EE学习笔记)解决Hibernate删除异常:deleted object would be re-saved by cascade
  3. matlab保存格式可以用cad打开文件,怎么将TXT文件导入CAD中生成图形
  4. 机器学习、深度学习方面书籍收集(持续更新……)
  5. [HNOI2002]营业额统计 Splay tree入门题
  6. 如何从右键弹出菜单中清空删除数据加清空前提问确定
  7. 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.6.6版)
  8. JasperReport| JasperReport中使用自定义字体(font)
  9. macbook只有windows下安装os系统、trackpad++下载
  10. Mysql 省市县乡 地址分割
  11. Fisher精确检验的通俗理解
  12. [CVE-2021-45105] Apache Log4j2 漏洞复现与原理详细分析
  13. java jibx,JiBx:BindGen命令行--通过Java POJO对象产生bind.xml和xsd文件
  14. 防卒指南:996+健身≈猝死
  15. gmail 设置 smtp_如何在Linux上使用Gmail或SMTP设置电子邮件警报
  16. Linux第7章Gdk及Cairo基础,源文件:Ubuntu中使用GLUT和GDK将图片文件加载到纹理单元...
  17. WIN7 嵌入式系统安装教程 Windows Embedded Standard 2011 安装
  18. 微信小程序、微信低版本兼容
  19. Google Earth Engine——无人机影像进行分类处理
  20. 成功解决TypeError: Value passed to parameter 'paddings' has DataType float32 not in list of allowed valu

热门文章

  1. hive命令出现问题Failed with exception Java.io.IOException:java.lang.IllegalArgumentException: java.NET.URI
  2. IntelliJ IDEA 2018.2 发布,支持 Java 11
  3. MySQL timediff()函数
  4. 违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制
  5. 【Python】Scrapy的安装与使用
  6. java中的泛型类型擦除
  7. 《白鹿原》金句摘抄(三)
  8. 19年8月 字母哥 番外篇:周边技术生态
  9. 用python绘制图形_使用Python的turtle画炫酷图形
  10. tomcat(7)日志记录器