使用Apache KeyedObjectPool的ssh连接池

我发现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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言怎么输入有空格的字符串

c语言怎么输入有空格的字符串 https://blog.csdn.net/qq_44752641/article/details/106118698 采用fgets输入可以识别空格,如输入hello world&#xff0c;输出hello world char str[50]; printf("输入一段字符串&#xff1a;"); fgets(str,50,stdin);若采用scanf&…

深入理解line-height与vertical-align——前端布局常用属性

line-height、font-size、vertical-align是设置行内元素布局的关键属性。这三个属性是相互依赖的关系&#xff0c;改变行间距离、设置垂直对齐等都需要它们的通力合作。下面将主要介绍line-height与vertical-align&#xff1a; 行高 【定义】 line-height行高是指文本行基线之…

UWP开发入门(四)——自定义CommandBar

UWP开发入门&#xff08;四&#xff09;——自定义CommandBar 原文:UWP开发入门&#xff08;四&#xff09;——自定义CommandBar各位好&#xff0c;再次回到UWP开发入门系列&#xff0c;刚回归可能有些不适应&#xff0c;所以今天我们讲个简单的&#xff0c;自定义CommandBar&…

(转)Cobbler无人值守批量安装Linux系统

本文目录&#xff1a; 1.1 pxe安装系统 1.2 cobbler基本介绍 1.3 安装和配置cobbler 1.3.1 安装cobbler 1.3.2 配置dhcp和tftp 1.4 cobbler从本地光盘安装系统 1.4.1 生成distro 1.4.2 提供kickstart文件 1.4.3 提供profile 1.4.4 开始安装 1.5 比pxekickstart好的地方 1.6 让新…

mysql 数据库 应用_MySQL数据库的应用

1、创建一个以你名字为名的数据库&#xff0c;并创建一张表student&#xff0c;该表包含三个字段(id&#xff0c;name&#xff0c;age)&#xff0c;表结构如下&#xff1a;mysql>desc student;---------------------------------------------------------| Field | Type | N…

Spring集成–从头开始应用程序,第1部分

开始之前 在本教程中&#xff0c;您将学习什么是Spring Integration &#xff0c;如何使用它以及有助于解决哪些问题。 我们将从头开始构建一个示例应用程序&#xff0c;并演示Spring Integration的一些核心组件。 如果您不熟悉Spring&#xff0c;请查看我编写的另一本有关Spri…

初学者Web介绍一些前端开发中的基本概念用到的技术

Web开发是比较费神的&#xff0c;需要掌握很多很多的东西&#xff0c;特别是从事前端开发的朋友&#xff0c;需要通十行才行。今天&#xff0c;本文向初学者介绍一些Web开发中的基本概念和用到的技术&#xff0c;从A到Z总共26项&#xff0c;每项对应一个概念或者技术。 初学者W…

幻方问题

把1~16的数字填入4x4的方格中&#xff0c;使得行、列以及两个对角线的和都相等&#xff0c;满足这样的特征时称为&#xff1a;四阶幻方。 四阶幻方可能有很多方案。如果固定左上角为1&#xff0c;请计算一共有多少种方案。 比如&#xff1a; 1 2 15 16 12 14 3 5 13 7 10 4 8 …

Xcode 快捷键及代码格式化

按住apple键点击类名就可以定位到这个类中查看相关定义&#xff08;在日后的开发中我们会经常这么来做&#xff0c;毕竟要记住iOS开发中所有的API是不现实的&#xff0c;有些API我们可以通过这种方法来查找&#xff09; PS&#xff1a;下面都是网上百度后经过我自己整理&#x…

mysql 4字节utf8_MySQL 4字节utf8字符更新失败一例

MySQL 4字节utf8字符更新失败一例业务的小伙伴反映了下面的问题问题有一个4字节的utf8字符????插入到MySQL数据库中时报错java.sql.SQLException: Incorrect string value: \xF0\xA0\x99\xB6 for column c_utf8mb4 at row 1数据库中存放该字符的列已经定义为utf8mb4编码了&…

主席树学习小结(POJ 2104)

在高中的时候就听到过主席树了&#xff0c;感觉非常高端&#xff0c;在寒假的时候 winter homework中有一题是查找区间第K大的树&#xff0c;当时就开始百度这种网上的博客&#xff0c;发现主席树看不懂&#xff0c;因为那个root[i]&#xff0c;还有tx[x].l与tx[x].r是什么意思…

通过Spring Social推特StackExchange –第1部分

本文将介绍一个快速的附带项目-一个自动从各种Q&#xff06;A StackExchange网站上发布热门问题的机器人&#xff0c;例如StackOverflow &#xff0c; ServerFault &#xff0c; SuperUser等。我们将为StackExchange API构建一个简单的客户端&#xff0c;然后进行设置使用Sprin…

下拉菜单

<!Doctype html> <html> <head> <meta charset"utf-8"> <title>下拉菜单</title> <style> *{ margin:0; padding:0; } ul{ list-style:none; overflow:hidden; background-color:#333; } li{ float:left; } li a,.drop…

51Nod 1753 相似子串

题目大意: 两个字符串相似定义为&#xff1a; 1.两个字符串长度相等 2.两个字符串对应位置上有且仅有至多一个位置所对应的字符不相同 给定一个字符串&#xff0c;每次询问两个子串在给定的规则下是否相似。给定的规则指每次给出一些等价关系&#xff0c;如‘a’b&#xff0c;‘…

deepin下Clion连接mysql_CLion如何添加依赖库 ? 需要把mysql/Connector c++放入 用cpp连接数据库...

目前我把下载的mysql/Connector 下载后放在了project内 但是报错信息如下报错信息如下In file included from /Users/wsgdrfz/study/c/Libary_System/librarySystem/sqlConnection.h:/Users/wsgdrfz/study/c/Libary_System/librarySystem/sqlFiles/include/mysql_connection.h7…

[开源JVM] yvm - 自制Java虚拟机

中文 | English | | | YVM是用C写的一个Java虚拟机&#xff0c;现在支持Java大部分功能&#xff0c;以及一个基于标记清除算法的并发垃圾回收器. 不过还有很多bug等待修复。 感兴趣的朋友pull request/fork/star吧。 Github repo https://github.com/racaljk/yvm 已支持语言…

MacOSX环境上的多个Java JDK

同样&#xff0c;这是在Mac&#xff08;OSX 10.8.x &#xff09;上配置Java开发环境的一个小技巧。 如果您现在真的开始&#xff0c;我建议您阅读我以前的文章之一 &#xff0c;这是一种快速&#xff0c;干净的方法&#xff08;我想&#xff09;来设置环境变量并开始Java编码。…

浏览器的标准模式和怪异模式

面试题之浏览器的标准模式和怪异模式 1.浏览器的标准模式和怪异模式到底是什么&#xff1f; 标准模式&#xff1a; 是浏览器按照W3C标准解析执行代码&#xff0c;这样用规定的语法去渲染&#xff0c;就可以兼容各个浏览器&#xff0c;保证以正确的形式展示网页。 怪异模式&…

printf函数输出超出int时怎么办

int、long、long long在printf中的格式 https://blog.csdn.net/fz_ywj/article/details/8107582 蓝桥杯 2796. BASIC-11 十六进制转十进制 从键盘输入一个不超过8位的正的十六进制数字符串&#xff0c;将它转换为正的十进制数后输出。   注&#xff1a;十六进制数中的10~15…

升级glibc的影响_Java 11 升级:“债务”“危机”

导读&#xff1a;AJDK11(阿里内部基于openJDK11的定制版本)在19年3月左右发布&#xff0c;到现在也快1年了&#xff0c;不过目前整体使用的面还是比较窄&#xff0c;特性被了解的也不是很多&#xff0c;Java11作为OpenJDK发布的LTS版本&#xff0c;对我们来说&#xff0c;还是需…