- 浏览: 623742 次
- 性别:
- 来自: 北京
博客专栏
-
实战cglib
浏览量:50232
文章分类
最新评论
-
zhongyuanceshi:
非常厉害。看了下有了整体认识
NanoHttpd源码分析 -
di1984HIT:
xuexile!!
使用Jackson在Java中处理JSON -
小胖vs小猪:
能说明一下jar包的引用情况么。
实战CGLib系列之proxy篇(一):方法拦截MethodInterceptor -
魔主万界DEV:
楼主写的不错啊!赞一个!
一个FTP Pool工具类的实现(Commons Pool) -
yuanliangding:
java里的select不是要用户自己调了?然后拿出key一个 ...
IO系列文章之五:读《Scalable io in java》看Socket网络编程模型演变
今天写了一个FTPPool,贴上来分享一下。
使用了相关的开源工具包2个:commons-net-3.0.1.jar和commons-pool-1.6.jar。
代码如下:
Pool.java:使用GenericObjectPool作为连接池管理连接,简单封装了borrowObject,returnObject。
public abstract class Pool<T> { private final GenericObjectPool<T> internalPool; public Pool(GenericObjectPool.Config poolConfig, PoolableObjectFactory factory) { this.internalPool = new GenericObjectPool<T>(factory, poolConfig); } public T getResource(){ try{ return this.internalPool.borrowObject(); }catch(Exception e){ e.printStackTrace(); return null; } } public void returnResource(T resource){ try { this.internalPool.returnObject(resource); }catch (Exception e) { e.printStackTrace(); } } public void destroy(){ try{ this.internalPool.close(); }catch (Exception e) { e.printStackTrace(); } } public int inPoolSize(){ try{ return this.internalPool.getNumIdle(); }catch(Exception e){ e.printStackTrace(); return 0; } } public int borrowSize(){ try{ return this.internalPool.getNumActive(); }catch(Exception e){ e.printStackTrace(); return 0; } } }
FTPPool.java:继承了抽象类Pool,在构造方法中实例化FTPPoolableObjectFactory,以处理GenericObjectPool中的操作。
public class FTPPool extends Pool<FTPClient>{ public FTPPool(Config poolConfig,String host,int port,String user,String password,String passiveModeConf){ super(poolConfig, new FTPPoolableObjectFactory(host, port, user, password, passiveModeConf)); } }
FTPPoolableObjectFactory.java:继承BasePoolableObjectFactory,其中的方法分别为:
GenericObjectPool内部会回调makeObject创建对象。
GenericObjectPool内部会回调destroyObject销毁对象。
GenericObjectPool内部会回调validateObject检验对象。
public class FTPPoolableObjectFactory extends BasePoolableObjectFactory{ private String host; private int port; private String user; private String password; private String passiveModeConf; public FTPPoolableObjectFactory(String host,int port,String user,String password,String passiveModeConf){ this.host = host; System.out.println("host:"+host); this.port = port; System.out.println("port:"+port); this.user = user; System.out.println("user:"+user); this.password = password; System.out.println("password:"+password); this.passiveModeConf = passiveModeConf; System.out.println("passiveModeConf:"+passiveModeConf); } @Override public Object makeObject() throws Exception { FTPClient ftpClient = new FTPClient(); ftpClient.connect(host, port); ftpClient.setControlKeepAliveTimeout(300);//set timeout to 5 minutes ftpClient.login(user, password); boolean passiveMode = false; if (passiveModeConf == null || Boolean.parseBoolean(passiveModeConf) == true){ passiveMode = true; } if (passiveMode) { ftpClient.enterLocalPassiveMode(); } ftpClient.setFileType(FTP.BINARY_FILE_TYPE); return ftpClient; } @Override public void destroyObject(Object obj) throws Exception { if(obj instanceof FTPClient){ FTPClient ftpClient=(FTPClient)obj; if(!ftpClient.isConnected()) return ; try{ ftpClient.disconnect(); }catch(Exception e){ e.printStackTrace(); } } } @Override public boolean validateObject(Object obj) { if(obj instanceof FTPClient){ FTPClient ftpClient=(FTPClient)obj; try{ return ftpClient.isConnected(); }catch(Exception e){ return false; } } return false; } }
最后是使用方法:
public static void main(String[] args) throws Exception{ GenericObjectPool.Config config = new Config(); //最大池容量 config.maxActive=5; //从池中取对象达到最大时,继续创建新对象. config.whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_GROW; //池为空时取对象等待的最大毫秒数. config.maxWait=60*1000; //取出对象时验证(此处设置成验证ftp是否处于连接状态). config.testOnBorrow=true; //还回对象时验证(此处设置成验证ftp是否处于连接状态). config.testOnReturn=true; FTPPool pool = new FTPPool(config,"XXXXXX",21,"xxxxxx","xxxxxx","true"); System.out.println("borrowSize1:"+pool.borrowSize()); System.out.println("inPoolSize1:"+pool.inPoolSize()); long begin=System.currentTimeMillis(); for(int i=0;i<8;i++){ FTPClient ftpClient = pool.getResource(); System.out.println("ftpClient"+(i+1)+" isConnected:"+ftpClient.isConnected()); //ftpClient.disconnect(); //pool.returnResource(ftpClient); pool.returnResource(ftpClient); } System.out.println("time:"+(System.currentTimeMillis()-begin)); System.out.println("borrowSize2:"+pool.borrowSize()); System.out.println("inPoolSize2:"+pool.inPoolSize()); pool.destroy(); }
其中testOnBorrow、testOnReturn设置为true时,会在回调中调用validateObject方法进行对象检验。 pool.getResource()方法会从池中取出对象,pool.returnResource()方法会向池中还回对象。具体API含义请参见commons-pool的文档。
以上就是一个简单的FTPPool的实现,commons-pool除了GenericObjectPool外还提供了不同的池。感觉有了这个开源工具随便写个连接池都方便很多了,所以一定要好好研究下。另外希望本文对看到的人有所帮助。
(PS:这段代码其实是参考了开源工具jedis-pool的源代码而写成,看来看开源代码对编程能力有很大提升。另外,今天要happy birthday!)
发表评论
-
redis中hash与list操作性能
2017-07-31 22:08 1716待补充... -
工作中使用Kafka接收消息代码整理
2017-06-25 14:51 868前段时间工作中使用到Kafka接收消息,简单整理一下: ... -
H5跨域请求解决方式整理
2017-05-14 14:44 3262H5跨域解决方式整理 以前工作中遇到过关于前端跨域访问问 ... -
一个微信小程序服务端开发实例
2017-04-23 11:10 1903前段时间因工作需要,研究了一下微信小程序Java服务端开发 ... -
一个简单的状态机总结
2014-02-07 21:23 1837工作中一个简单的状态机实现,总结如下。 定义状态: p ... -
spring+mybatis配置
2013-11-30 09:06 861mybatis配置部分: <?xml versio ... -
关于MySQL主从不同步问题
2013-09-24 21:49 1983今天线上出现了数据更新后在手机终端无法获取最新数据的问题。 ... -
工作中遇到的一个关于hibernate jpa的问题
2013-08-15 06:41 995昨天用hibernate-jpa(2.0)时发现一个问题, ... -
关于MySQL导入导出SQL文件
2013-08-14 06:50 1079记录一下几个常用的MySQL导入导出命令: 1、Mysq ... -
Tomcat调优相关总结
2013-08-09 07:50 1123关于Tomcat调优的一些 ... -
与git服务器添加信任关系
2013-08-08 07:13 26831、本地机器,进入GitBash: ssh-keygen ... -
关于Redis扩容方案
2013-08-08 07:33 2915首先关于Redis,目前某应用redis部署2台机器,做m ... -
某高并发应用JVM启动参数配置
2013-07-29 21:51 3294这个是目前公司某高并发应用生产环境的JVM启动参数,该应用 ... -
使用tcpdump+wireshark进行应用分析
2013-07-12 06:32 7552前一段时间接了一个任务,把目前主流的应用市场请求响应全抓出 ... -
关于解析不合法JSON的方法
2013-05-16 06:37 8929最近工作中写了一个抓取第三方应用数据的程序,该数据格式为J ... -
关于回调
2013-05-12 19:37 1031本文主要是自己对于回调的一些总结记录,如果有错误欢迎大家指 ... -
非android环境获取apk签名信息
2013-04-30 15:14 5588前段时间在工作中遇到一个问题,即在非android环境下获 ... -
Java中的volatile关键字作用[转自网络]
2013-03-27 21:34 873在Java内存模型下,线程可以把变量保存在本地内存(比如机 ... -
Java中的transient关键字
2013-03-26 21:43 833Java的serialization提供了一种持久化对象实 ... -
Java无限循环小数判定问题
2013-03-26 21:40 4337今天遇到一个2个整数相除后无限循环小数判定的问题,我还在纠 ...
相关推荐
开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发...
使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...
commo-pool, commons-pool commons-pool commons-pool
org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能
commons-pool-1.1.jar, commons-pool-1.2.jar, commons-pool-1.3-src.jar, commons-pool-1.3.jar, commons-pool-1.4.jar, commons-pool-1.5.1.jar, commons-pool-1.5.2-sources.jar, commons-pool-1.5.2.jar, ...
赠送jar包:commons-pool2-2.10.0.jar; 赠送原API文档:commons-pool2-2.10.0-javadoc.jar; 赠送源代码:commons-pool2-2.10.0-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.10.0.pom; 包含翻译后的API...
commons-pool-1.3.jar+commons-pool.jar;java连接池jar包java连接池;java连接池jar;commons-pool-1.2.jar;commons-pool-1.3.jar+commons-pool.jar;java连接池jar包java连接池;java连接池jar;commons-pool-1.2.jar;...
赠送jar包:commons-pool2-2.10.0.jar; 赠送原API文档:commons-pool2-2.10.0-javadoc.jar; 赠送源代码:commons-pool2-2.10.0-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.10.0.pom; 包含翻译后的API...
赠送jar包:commons-pool2-2.0.jar; 赠送原API文档:commons-pool2-2.0-javadoc.jar; 赠送源代码:commons-pool2-2.0-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.0.pom; 包含翻译后的API文档:...
commons-collections.jar、 commons-pool.jar、 commons-dbcp-1.2.1.jar三个jar包3分超值放送啊
Jakarta Commons Pool是一个用于在Java程序中实现对象池化的组件。它的基本情况是: 主要作者:Morgan Delagrange、Geir Magnusson、Craig McClanahan、Rodney Waldhoff、David Weinrich和Dirk Verbeeck 最新版本:...
赠送jar包:commons-pool2-2.5.0.jar; 赠送原API文档:commons-pool2-2.5.0-javadoc.jar; 赠送源代码:commons-pool2-2.5.0-sources.jar; 包含翻译后的API文档:commons-pool2-2.5.0-javadoc-API文档-中文...
赠送jar包:commons-pool2-2.4.3.jar; 赠送原API文档:commons-pool2-2.4.3-javadoc.jar; 赠送源代码:commons-pool2-2.4.3-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.4.3.pom; 包含翻译后的API文档...
DBCP(DataBase Connection Pool)是 apache common上的一个 java 连接池项目,也是 tomcat 使用的连接池组件,依赖 于Jakarta commons-pool 对象池机制,DBCP可以直接的在应用程序中使用。 使用DBCP会用到commons-...
赠送jar包:commons-pool2-2.3.jar; 赠送原API文档:commons-pool2-2.3-javadoc.jar; 赠送源代码:commons-pool2-2.3-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.3.pom; 包含翻译后的API文档:...
减少代码的工具类工具类之commons.md
commons-pool-1.6,commons-dbcp-1.4 连接池下载
commons-pool-1.6.jar DBCP数据库连接池必不可少的jar包
Apache commons-pool本质上是"对象池",即通过一定的规则来维护对象集合的容器;commos-pool在很多场景中,用来实现"连接池"/"任务worker池"等,大家常用的dbcp数据库连接池,也是基于commons-pool实现.
commons-pool 源代码commons-pool 源代码commons-pool 源代码commons-pool 源代码commons-pool 源代码