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
原创粉丝点击