ftp连接池实现

    xiaoxiao2021-03-25  111

    项目中需要用到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
    转载请注明原文地址: https://ju.6miu.com/read-4238.html

    最新回复(0)