项目中需要用到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