- 浏览: 635181 次
- 性别:
- 来自: 北京
博客专栏
-
实战cglib
浏览量:50704
文章分类
最新评论
-
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 1811待补充... -
工作中使用Kafka接收消息代码整理
2017-06-25 14:51 921前段时间工作中使用到Kafka接收消息,简单整理一下: ... -
H5跨域请求解决方式整理
2017-05-14 14:44 3411H5跨域解决方式整理 以前工作中遇到过关于前端跨域访问问 ... -
一个微信小程序服务端开发实例
2017-04-23 11:10 1966前段时间因工作需要,研究了一下微信小程序Java服务端开发 ... -
一个简单的状态机总结
2014-02-07 21:23 1898工作中一个简单的状态机实现,总结如下。 定义状态: p ... -
spring+mybatis配置
2013-11-30 09:06 912mybatis配置部分: <?xml versio ... -
关于MySQL主从不同步问题
2013-09-24 21:49 2034今天线上出现了数据更新后在手机终端无法获取最新数据的问题。 ... -
工作中遇到的一个关于hibernate jpa的问题
2013-08-15 06:41 1053昨天用hibernate-jpa(2.0)时发现一个问题, ... -
关于MySQL导入导出SQL文件
2013-08-14 06:50 1121记录一下几个常用的MySQL导入导出命令: 1、Mysq ... -
Tomcat调优相关总结
2013-08-09 07:50 1173关于Tomcat调优的一些 ... -
与git服务器添加信任关系
2013-08-08 07:13 27301、本地机器,进入GitBash: ssh-keygen ... -
关于Redis扩容方案
2013-08-08 07:33 2968首先关于Redis,目前某应用redis部署2台机器,做m ... -
某高并发应用JVM启动参数配置
2013-07-29 21:51 3351这个是目前公司某高并发应用生产环境的JVM启动参数,该应用 ... -
使用tcpdump+wireshark进行应用分析
2013-07-12 06:32 7607前一段时间接了一个任务,把目前主流的应用市场请求响应全抓出 ... -
关于解析不合法JSON的方法
2013-05-16 06:37 8980最近工作中写了一个抓取第三方应用数据的程序,该数据格式为J ... -
关于回调
2013-05-12 19:37 1070本文主要是自己对于回调的一些总结记录,如果有错误欢迎大家指 ... -
非android环境获取apk签名信息
2013-04-30 15:14 5639前段时间在工作中遇到一个问题,即在非android环境下获 ... -
Java中的volatile关键字作用[转自网络]
2013-03-27 21:34 917在Java内存模型下,线程可以把变量保存在本地内存(比如机 ... -
Java中的transient关键字
2013-03-26 21:43 892Java的serialization提供了一种持久化对象实 ... -
Java无限循环小数判定问题
2013-03-26 21:40 4400今天遇到一个2个整数相除后无限循环小数判定的问题,我还在纠 ...
相关推荐
这为开发者提供了一个可以直接学习和借鉴的实例,通过阅读源码,开发者可以更深入地理解SpringBoot与FTP的集成,以及FtpUtil工具类的具体实现。 总的来说,基于SpringBoot的FtpUtil工具类为我们提供了一种便捷的...
接下来,我们需要创建一个FTP连接池配置类。这里可以定义连接池的基本属性,如最大连接数、空闲超时时间等: ```java @Configuration public class FtpConfig { @Value("${ftp.host}") private String host; @...
Commons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实现. Primitives Commons-Primitives提供了一个更小,更快和更易使用的对Java基本类型的支持。当前主要是针对基本类型的 ...
标题“使用servicemix实现FTP连接池”指的是在Java环境中利用Apache ServiceMix框架来创建一个FTP连接池,以提高FTP客户端的性能和资源管理效率。ServiceMix是Apache软件基金会的一个开源企业服务总线(ESB),它...
8. **Net**:Apache Commons Net 提供了网络编程所需的工具类和协议实现,如FTP、SMTP、Telnet等,便于开发者构建网络应用。 9. **Proxy**:Apache Commons Proxy 提供了动态代理的实现,使得在运行时创建和管理...
在Java开发中,Apache Commons是一个非常重要的库集合,它提供了许多实用工具类,极大地丰富了标准Java类库的功能。这个"JAVA-commons-jar包"包含的13个jar包很可能是Apache Commons的不同模块,每个模块专注于特定...
这本书旨在帮助开发者更好地理解和利用Jakarta Commons库中的各种工具类和模块,提升Java应用程序的效率和质量。Jakarta Commons是Apache软件基金会的一个项目,它包含了一系列小型且独立的组件,这些组件提供了许多...
20. **Commons Lang**: 提供了大量通用工具类,扩展了 Java 核心类库,如字符串处理、日期时间等。 21. **Commons Latka**: 用于自动化 HTTP 功能测试、验收测试和衰减测试。 22. **Commons Launcher**: 提供跨...
4. **commons-io-2.4-bin.zip**:Apache Commons IO库提供了各种I/O操作的工具类,包括文件系统操作、流操作、读写字符和字节、转换等。版本2.4改进了对nio的集成,增加了更多的文件过滤器和比较工具。 5. **...
这可以通过`FTPClient`的`listFiles()`方法来实现,它返回一个`FTPFile`数组,包含服务器上所有文件的信息。通过比较本地和远程文件的大小和修改时间,可以判断是否需要传输以及从哪里开始传输。 3. **断点续传逻辑...
Apache Commons 是一个由Apache软件基金会开发的Java库项目,它为Java程序员提供了大量实用的工具类和组件,极大地简化了日常编程任务。这个压缩包包含了Apache Commons项目中的多个公共jar包,总计17个,这可能包括...
15. **IO**: Commons-IO提供了各种I/O操作的工具类,包括文件操作、流操作、字符集转换等功能。 16. **Jelly**: Jelly是一个基于XML的脚本和处理引擎,可以用于命令行、Ant或Servlet环境,类似于JSP和Velocity的...
15. **Commons Logging**: 提供了一个统一的日志接口,可以适配多种日志实现,增强了日志系统的灵活性。 16. **Commons HttpClient**: (已废弃,推荐使用 Apache HTTP Components) 提供了 HTTP 客户端实现,支持...
5. **Lang组件**:Commons-Lang模块包含一系列通用的字符串处理、异常处理、日期时间操作等工具类,极大地增强了Java标准库的功能。 6. **Digester组件**:用于XML到Java对象的映射,通常在配置文件解析或对象创建...
Jakarta Commons 是一个由 Apache 软件基金会维护的 Java 开源项目集合,它提供了大量的实用工具类和组件,极大地丰富了 Java 的标准库功能。这个项目旨在解决常见的编程问题,提高开发效率,提供了一系列模块化的...
Apache Commons 是一个由Apache软件基金会维护的开源项目,它提供了大量的Java类库,这些类库旨在解决常见的编程任务,从而简化开发过程并提高代码的可重用性。这个项目已经发展成为Java开发者不可或缺的资源,因为...
HttpClient是Jakarta Commons库中的一个组件,它提供了高级的HTTP客户端编程接口,用于构建能够与Web服务器进行交互的应用程序。HttpClient简化了HTTP请求和响应的处理流程,支持多种HTTP协议版本,包括GET、POST、...
尤其在一些需要高效稳定传输大量数据的企业环境中,Apache FTP Server 成为了一个非常受欢迎的选择。CMMB中广传媒项目就是其中之一,该项目利用了Apache FTP Server这一开源组件,实现了与项目数据库的连接,并通过...
Jakarta Commons是Apache软件基金会的一个项目集合,它包含了一系列实用工具类库,为Java开发者提供了大量方便的功能。这个"2013最新版的jakarta-commons.zip"压缩包很可能包含了当年Jakarta Commons项目的各个子...
Apache Jakarta Commons是Apache软件基金会的一个项目集合,它提供了一系列实用工具类库,旨在简化Java开发。这个项目的主要目标是创建可重用的Java组件,这些组件涵盖了从数据处理到网络通信的各种领域。Iverson的...