`

一个FTP Pool工具类的实现(Commons Pool)

 
阅读更多

今天写了一个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!)

分享到:
评论
1 楼 魔主万界DEV 2016-12-06  
楼主写的不错啊!赞一个!

相关推荐

    基于springboot的FtpUtil工具类.zip

    这为开发者提供了一个可以直接学习和借鉴的实例,通过阅读源码,开发者可以更深入地理解SpringBoot与FTP的集成,以及FtpUtil工具类的具体实现。 总的来说,基于SpringBoot的FtpUtil工具类为我们提供了一种便捷的...

    springboot集成ftp连接池工具

    接下来,我们需要创建一个FTP连接池配置类。这里可以定义连接池的基本属性,如最大连接数、空闲超时时间等: ```java @Configuration public class FtpConfig { @Value("${ftp.host}") private String host; @...

    apache-commons源码及jar文件

    Commons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实现. Primitives Commons-Primitives提供了一个更小,更快和更易使用的对Java基本类型的支持。当前主要是针对基本类型的 ...

    使用servicemix实现FTP连接池

    标题“使用servicemix实现FTP连接池”指的是在Java环境中利用Apache ServiceMix框架来创建一个FTP连接池,以提高FTP客户端的性能和资源管理效率。ServiceMix是Apache软件基金会的一个开源企业服务总线(ESB),它...

    Apache Commons组件简介.ppt

    8. **Net**:Apache Commons Net 提供了网络编程所需的工具类和协议实现,如FTP、SMTP、Telnet等,便于开发者构建网络应用。 9. **Proxy**:Apache Commons Proxy 提供了动态代理的实现,使得在运行时创建和管理...

    JAVA-commons-jar包

    在Java开发中,Apache Commons是一个非常重要的库集合,它提供了许多实用工具类,极大地丰富了标准Java类库的功能。这个"JAVA-commons-jar包"包含的13个jar包很可能是Apache Commons的不同模块,每个模块专注于特定...

    jakarta commons cookbook 电子版

    这本书旨在帮助开发者更好地理解和利用Jakarta Commons库中的各种工具类和模块,提升Java应用程序的效率和质量。Jakarta Commons是Apache软件基金会的一个项目,它包含了一系列小型且独立的组件,这些组件提供了许多...

    JAKARTA COMMONS

    20. **Commons Lang**: 提供了大量通用工具类,扩展了 Java 核心类库,如字符串处理、日期时间等。 21. **Commons Latka**: 用于自动化 HTTP 功能测试、验收测试和衰减测试。 22. **Commons Launcher**: 提供跨...

    apache commons 下 所有 jar 大全

    4. **commons-io-2.4-bin.zip**:Apache Commons IO库提供了各种I/O操作的工具类,包括文件系统操作、流操作、读写字符和字节、转换等。版本2.4改进了对nio的集成,增加了更多的文件过滤器和比较工具。 5. **...

    java实现FTP多线程断点续传

    这可以通过`FTPClient`的`listFiles()`方法来实现,它返回一个`FTPFile`数组,包含服务器上所有文件的信息。通过比较本地和远程文件的大小和修改时间,可以判断是否需要传输以及从哪里开始传输。 3. **断点续传逻辑...

    Apache Commons 公共jar包

    Apache Commons 是一个由Apache软件基金会开发的Java库项目,它为Java程序员提供了大量实用的工具类和组件,极大地简化了日常编程任务。这个压缩包包含了Apache Commons项目中的多个公共jar包,总计17个,这可能包括...

    commons包介绍1

    15. **IO**: Commons-IO提供了各种I/O操作的工具类,包括文件操作、流操作、字符集转换等功能。 16. **Jelly**: Jelly是一个基于XML的脚本和处理引擎,可以用于命令行、Ant或Servlet环境,类似于JSP和Velocity的...

    commons中的21个核心架包

    15. **Commons Logging**: 提供了一个统一的日志接口,可以适配多种日志实现,增强了日志系统的灵活性。 16. **Commons HttpClient**: (已废弃,推荐使用 Apache HTTP Components) 提供了 HTTP 客户端实现,支持...

    介绍Jakarta Commons的烹饪书

    5. **Lang组件**:Commons-Lang模块包含一系列通用的字符串处理、异常处理、日期时间操作等工具类,极大地增强了Java标准库的功能。 6. **Digester组件**:用于XML到Java对象的映射,通常在配置文件解析或对象创建...

    Jakarta+Commons+学习

    Jakarta Commons 是一个由 Apache 软件基金会维护的 Java 开源项目集合,它提供了大量的实用工具类和组件,极大地丰富了 Java 的标准库功能。这个项目旨在解决常见的编程问题,提高开发效率,提供了一系列模块化的...

    Apache Commons

    Apache Commons 是一个由Apache软件基金会维护的开源项目,它提供了大量的Java类库,这些类库旨在解决常见的编程任务,从而简化开发过程并提高代码的可重用性。这个项目已经发展成为Java开发者不可或缺的资源,因为...

    Jakarta Commons Online Bookshelf

    HttpClient是Jakarta Commons库中的一个组件,它提供了高级的HTTP客户端编程接口,用于构建能够与Web服务器进行交互的应用程序。HttpClient简化了HTTP请求和响应的处理流程,支持多种HTTP协议版本,包括GET、POST、...

    apache ftpserver使用讲解

    尤其在一些需要高效稳定传输大量数据的企业环境中,Apache FTP Server 成为了一个非常受欢迎的选择。CMMB中广传媒项目就是其中之一,该项目利用了Apache FTP Server这一开源组件,实现了与项目数据库的连接,并通过...

    jakarta-commons.zip

    Jakarta Commons是Apache软件基金会的一个项目集合,它包含了一系列实用工具类库,为Java开发者提供了大量方便的功能。这个"2013最新版的jakarta-commons.zip"压缩包很可能包含了当年Jakarta Commons项目的各个子...

    Iverson book Apache Jakarta Commons[E文版]

    Apache Jakarta Commons是Apache软件基金会的一个项目集合,它提供了一系列实用工具类库,旨在简化Java开发。这个项目的主要目标是创建可重用的Java组件,这些组件涵盖了从数据处理到网络通信的各种领域。Iverson的...

Global site tag (gtag.js) - Google Analytics