抽象类:

package com.echo.store;

import java.util.Enumeration;
import java.util.Hashtable; abstract class ObjectPool<T> { long ttl ;
Hashtable<T,Long> lock,unlock ; public ObjectPool() {
ttl = 50000;
lock = new Hashtable<T, Long>();
unlock = new Hashtable<T,Long>();
} abstract T create(); abstract boolean valide(T t); abstract void destory( T t ); synchronized public T takeOut(){ long now = System.currentTimeMillis();
T t ;
if(unlock.size() > 0){
Enumeration<T> e = unlock.keys();
while ( e.hasMoreElements() ){
t = e.nextElement();
if( ( now-unlock.get(t) > ttl) || !valide(t) ){
unlock.remove(t);
destory(t);
t = null;
}else{
unlock.remove(t);
lock.put(t, ttl);
return t;
}
}
}
t = create();
lock.put(t,ttl);
return t;
} synchronized public void takeIn( T t ){
lock.remove(t);
unlock.put( t, ttl);
} }

Ftp链接池实现类:

package com.echo.store;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient; import java.io.IOException;
import java.util.Hashtable; public class FtpPool extends ObjectPool<FTPClient> { FtpConfig ftpConfig; public static Hashtable<FtpConfig, FtpPool> instance = new Hashtable<FtpConfig, FtpPool>(); public static final FtpPool getInstance( FtpConfig cfg ){
if (instance.get(cfg) == null) {
synchronized (FtpPool.class){
if (instance.get(cfg) == null) {
instance.put(cfg, new FtpPool( cfg ));
}
}
}
return instance.get(cfg);
} public FtpPool( FtpConfig ftpCfg ) {
ftpConfig = ftpCfg;
} @Override
FTPClient create( ) {
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(ftpConfig.getIp());
ftpClient.login(ftpConfig.getUser(),ftpConfig.getPasswd());
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
} catch (IOException e) {
e.printStackTrace();
} return ftpClient;
} @Override
boolean valide(FTPClient ftpClient) {
return ftpClient.isConnected();
} @Override
void destory(FTPClient ftpClient) {
//ftpClient.;
}
}

调用方法:

   public static void main(String[] args) {

        FtpConfig cfg = new FtpConfig();
cfg.setIp("xxx");
cfg.setUser("xxx");
cfg.setPasswd("vvv");
FtpPool instance = FtpPool.getInstance(cfg);
FTPClient ftpClient = instance.takeOut();
FtpOperation ftpOperation = FtpOperation.getInstance();
ftpOperation.download(ftpClient,"/remote", "./location");
}

上传方法实现:

package com.echo.services;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; public class FtpOperation { Logger log = LoggerFactory.getLogger(FtpOperation.class); public static FtpOperation instance = null;
private FtpOperation() {}
public static FtpOperation getInstance(){
if( instance == null ){
synchronized (FtpOperation.class){
if (instance == null) {
instance = new FtpOperation();
}
}
}
return instance;
} public void download(FTPClient ftpClient, String remote, String loc ){ try {
log.info("remote :"+remote);
ftpClient.changeWorkingDirectory(remote);
//生成本地目录
File locFile = new File(loc);
if( !locFile.exists() ){
locFile.mkdir();
}
downLoadFile(ftpClient, loc);
} catch (IOException e) {
e.printStackTrace();
} } private void downLoadFile( FTPClient ftpClient, String LocDir ){ try {
for (FTPFile ftpFile : ftpClient.listFiles()) {
String path = LocDir+"/"+ftpFile.getName();
if( ftpFile.isDirectory() ){
//生成本地目录
File localFile = new File( path );
if( !localFile.exists() ){
localFile.mkdir();
}
//浏览Ftp目录
ftpClient.changeWorkingDirectory( ftpFile.getName());
downLoadFile(ftpClient, path );
ftpClient.changeToParentDirectory();
}else{
if(
( !ftpFile.getName().equals("ualice.access.log") )
){
continue;
}
FileOutputStream fostream = new FileOutputStream( path );
ftpClient.retrieveFile(ftpFile.getName(), fostream);
fostream.flush();
fostream.close();
log.info("文件:"+LocDir+ftpFile.getName()+" 下载完毕。");
}
}
} catch (IOException e) {
e.printStackTrace();
} } }

JAVA ftp连接池功能实现的更多相关文章

  1. Java 自定义FTP连接池

    转自:https://blog.csdn.net/eakom/article/details/79038590 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...

  2. FTP连接池

    我们项目使用的是 Apache的(commons-net-3.2.jar) FTPClient,但是系统偶尔会有异常,趁着刚解决完,总结一下. 日志中提示是类似 java.lang.Exception ...

  3. Java Mysql连接池配置和案例分析--超时异常和处理

    前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...

  4. java自定义连接池

    1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...

  5. 使用commons-pool2实现FTP连接池

    ​ GitHub : https://github.com/jayknoxqu/ftp-pool 一. 连接池概述 ​ 频繁的建立和关闭连接,会极大的降低系统的性能,而连接池会在初始化的时候会创建一定 ...

  6. MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物

    dbcp下载 传送门 Commons Pool下载 传送门 Commons log下载 传送门 MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_( ...

  7. MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池

    MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_(Java)[连接池]使用DBCP简单模拟银行转账事物 传送门 Java应用程序访问数据库的过程: ...

  8. Java创建连接池连接不同数据库

    在一个应用里面,可能涉及到连接多个不同数据库进行操作,而每次连接写不同的实现会很麻烦.前面已经会了用JDBC连接数据库,那么利用反射和工厂模式,可以实现连接不同的数据库,这样处理起来将会很方便.同时建 ...

  9. Java开源连接池c3p0的基本用法

    前言:其实c3p0只是一个实现了javax.sql 接口 DataSource的一个工具集,使用c3p0可以帮我们管理宝贵的Connection资源,无须我们去创建连接(免去每次配置数据库驱动,url ...

随机推荐

  1. Mac使用Xcode配置openGL

    Mac使用Xcode配置openGL 博主这学期有图形学课要用到OpenGL,于是首先就开始配置开发环境了.应该说网上Windows上配置OpenGL教程比较多,Mac版的比较少.博主特来分享配置过程 ...

  2. 常用的sort打乱数组方法真的有用?

    JavaScript 开发中有时会遇到要将一个数组随机排序(shuffle)的需求,一个常见的写法是这样: function shuffle(arr) { arr.sort(function () { ...

  3. Vue(二十)项目初始化步骤

    提:需要安装 node.js / npm淘宝镜像 / webpack / vue-cli脚手架构建工具 1.创建项目 - vue init webpack framework https://gith ...

  4. jquery 上下滚动显示隐藏

      function scroll(fn) { var beforeScrollTop = document.body.scrollTop, fn = fn || function() {}; win ...

  5. 出现明明SQL语句没问题,但是却无法通过代码查询到结果的问题。

    问题:SQL语句查询不到记录,导致空指针异常 SQL语句: select * from mixinfo where infotype='网站简介' 代码: publicList<HashMap& ...

  6. django之模型层(model)--多表相关操作(图书管理小练习)

    前面几篇随笔的数据库增删改查操作都是在单表的操作上的,然而现实中不可能都是单表操作,更多的是多表操作,一对一,一对多,多对多的表结构才是我们经常需要处理的,本篇将带我们了解多表操作的一些相关操作.也会 ...

  7. .NET分布式缓存Redis从入门到实战

    一.课程介绍 今天阿笨给大家带来一堂NOSQL的课程,本期的主角是Redis.希望大家学完本次分享课程后对redis有一个基本的了解和认识,并且熟悉和掌握 Redis在.NET中的使用. 本次分享课程 ...

  8. List集合序列排序的两种方法

    首先讲一下Comparable接口和Comparator接口,以及他们之间的差异.有助于Collections.sort()方法的使用.请参考 1.Comparable自然规则排序//在自定义类Stu ...

  9. .NET/C# 资源

     .NET/C#  开源资源收集 Roslyn ---C# 开源编译器 iSpy免费的开源视频监控平台   https://github.com/ispysoftware/iSpy .NET Fram ...

  10. 阿里云物联网平台体验(树莓派+Python篇)

    阿里云物联网平台体验(树莓派+Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作.但是同时也见证了 ...