ftp连接池实现
来源:互联网 发布:linux vi如何到指定行 编辑:程序博客网 时间:2024/06/06 16:59
项目中需要用到ftp,经常性的开关会造成极大的开销,效率比较低。就想封装一个ftp连接池,不过遗憾的是没有找到现成的,只得根据别人提供的思路来实现了。
中心思想:
创建若干个ftp连接,然后将这些连接放入阻塞队列BlockingQueue中,每次使用时从队列中获取一个连接,使用完成后将连接重新插入队列中。
实现ObjectPool接口就可以实现一个简单的自定义连接池。
public class FTPClientPool implements ObjectPool<FTPClient> { private static Logger logger = LoggerFactory.getLogger(FTPClient.class); private static final int DEFAULT_POOL_SIZE = 10; public BlockingQueue<FTPClient> blockingQueue; private FTPClientFactory factory; public FTPClientPool(FTPClientFactory factory) throws Exception { this(DEFAULT_POOL_SIZE, factory); } public FTPClientPool(int poolSize, FTPClientFactory factory) throws Exception { this.factory = factory; this.blockingQueue = new ArrayBlockingQueue<FTPClient>(poolSize); initPool(poolSize); } /** * 初始化连接池 * @param maxPoolSize * 最大连接数 * @throws Exception */ private void initPool(int maxPoolSize) throws Exception { int count = 0; while(count < maxPoolSize) { this.addObject(); count++; } } /** * 从连接池中获取对象 */ @Override public FTPClient borrowObject() throws Exception { FTPClient client = blockingQueue.take(); if(client == null) { client = factory.makeObject(); } else if(!factory.validateObject(client)) { invalidateObject(client); client = factory.makeObject(); } return client; } /** * 返还一个对象(链接) */ @Override public void returnObject(FTPClient client) throws Exception { if ((client != null) && !blockingQueue.offer(client,2,TimeUnit.MINUTES)) { try { factory.destroyObject(client); } catch (Exception e) { throw e; } } } /** * 移除无效的对象(FTP客户端) */ @Override public void invalidateObject(FTPClient client) throws Exception { blockingQueue.remove(client); } /** * 增加一个新的链接,超时失效 */ @Override public void addObject() throws Exception { blockingQueue.offer(factory.makeObject(), 2, TimeUnit.MINUTES); } /** * 重新连接 */ public FTPClient reconnect() throws Exception { return factory.makeObject(); } /** * 获取空闲链接数(这里暂不实现) */ @Override public int getNumIdle() { return blockingQueue.size(); } /** * 获取正在被使用的链接数 */ @Override public int getNumActive() { return DEFAULT_POOL_SIZE - getNumIdle(); } @Override public void clear() throws Exception { } /** * 关闭连接池 */ @Override public void close() { try { while(blockingQueue.iterator().hasNext()) { FTPClient client = blockingQueue.take(); factory.destroyObject(client); } } catch(Exception e) { logger.error("close ftp client pool failed...{}", e); } } @Override public void setFactory(PoolableObjectFactory<FTPClient> factory) throws IllegalStateException, UnsupportedOperationException { } /** * 增加一个新的链接,超时失效 */ public void addObject(FTPClient ftpClient) throws Exception { blockingQueue.put(ftpClient); }}
项目下载:
http://download.csdn.net/detail/wd501771382/9774424
0 0
- ftp连接池实现
- 基于apache commons pool实现自动以ftp连接池
- FTP连接
- ftp连接
- FTP连接
- java实现连接ftp然后在线读取文件。
- SHELL实现FTP自动连接非默认端口的主机
- hbuilder 连接到ftp实现代码上传下载功能
- Java连接FTP并且实现文件的上传和下载
- Ubuntu 14.04 配置vsftpd实现FTP服务器 - 通过FTP连接AWS
- Ubuntu 14.04 配置vsftpd实现FTP服务器 - 通过FTP连接AWS
- FTP实现
- ftp连接过程
- FTP连接穿过防火墙
- 使用VC连接ftp
- 使用VC连接ftp
- 自动连接ftp脚本
- ABAP连接FTP服务器
- MyEclipse中安裝Tomcat
- iOS利用系统分享实现分享视频功能
- Django mysql 删除表后再次创建
- 深入理解session,cookie
- stm32
- ftp连接池实现
- 当IE浏览器不支持document.getElementByClassName()
- Java RMI详解
- div使用jQuery autocomplete
- 面试题
- Java动态代理的两种实现方法
- css3新属性 附上盒子居中例子
- navicat 10.0.50注册码
- ng-class