JAVA ftp连接池功能实现
抽象类:
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连接池功能实现的更多相关文章
- Java 自定义FTP连接池
转自:https://blog.csdn.net/eakom/article/details/79038590 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...
- FTP连接池
我们项目使用的是 Apache的(commons-net-3.2.jar) FTPClient,但是系统偶尔会有异常,趁着刚解决完,总结一下. 日志中提示是类似 java.lang.Exception ...
- Java Mysql连接池配置和案例分析--超时异常和处理
前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...
- java自定义连接池
1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...
- 使用commons-pool2实现FTP连接池
GitHub : https://github.com/jayknoxqu/ftp-pool 一. 连接池概述 频繁的建立和关闭连接,会极大的降低系统的性能,而连接池会在初始化的时候会创建一定 ...
- MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物
dbcp下载 传送门 Commons Pool下载 传送门 Commons log下载 传送门 MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_( ...
- MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池
MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_(Java)[连接池]使用DBCP简单模拟银行转账事物 传送门 Java应用程序访问数据库的过程: ...
- Java创建连接池连接不同数据库
在一个应用里面,可能涉及到连接多个不同数据库进行操作,而每次连接写不同的实现会很麻烦.前面已经会了用JDBC连接数据库,那么利用反射和工厂模式,可以实现连接不同的数据库,这样处理起来将会很方便.同时建 ...
- Java开源连接池c3p0的基本用法
前言:其实c3p0只是一个实现了javax.sql 接口 DataSource的一个工具集,使用c3p0可以帮我们管理宝贵的Connection资源,无须我们去创建连接(免去每次配置数据库驱动,url ...
随机推荐
- 向excel中循环插入值
import xlrd #导入excel读模块 from xlutils import copy #导入copy模块 book = xlrd.open_workbook('tb_base_buildi ...
- angular.copy()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 如何修改IE浏览器的User-Agent用户代理字符串信息
每款浏览器都有一个专属的 User-Agent 字符串信息, 通过 User-Agent 网站可以检测用户所使用的浏览器版本.某些网站为了让用户获得更好的浏览体验,通过检测用户的浏览器版本,以确认用户 ...
- MySQL 数据库-索引注意事项
索引注意事项 (1)最左前缀原则 如果查询的时候,查询条件精确匹配索引的左边连续一列或几列,则可以命中索引. (2)避免where 子句中对字段施加函数,如to_date(create_tim ...
- MiniUI破解方法
解决JQuery MiniUI前端库到期alert弹窗 MINIUI的到期提示是通过JS的Alert 方法弹出的. 那么我们可以不可以截获所有Alert方法,过滤文本.然后….你们懂得 我们只需要在页 ...
- 发现一个“佛系记账本”
因为这是一款微信小程序,张小龙大力推崇的"用完即走"完美地适合记账应用. 不用下载.不用安装.不用注册.不用各种授权,只要从微信进入,就能记账,账本只与微信关联. 换手机.换PAD ...
- [Canvas]空战游戏 已经可以玩了 1.13Playable
空战游戏做到这里,己方运动,己方发射子弹,敌方运动,敌方发射子弹,子弹与飞机碰撞,飞机与飞机碰撞都已经具备了,换言之已经可以玩了. 还需要一个奖励升级系统,在上面显示击落敌机数量等,还有己方不幸被击落 ...
- bcrypt 加密
关于 bcrypt:1.bcrypt是不可逆的加密算法,无法通过解密密文得到明文.2.bcrypt和其他对称或非对称加密方式不同的是,不是直接解密得到明文,也不是二次加密比较密文,而是把明文和存储的密 ...
- 【PMP】项目整合管理
项目整合的七个过程组: 制定项目章程 制定项目管理计划 指导语管理项目工作 管理项目知识 监控项目工作 实施整体变更控制 结束项目或阶段 1.制定项目章程 1.1 定义 制定项目章程是编写一份正式批准 ...
- 最新的Delphi版本号对照
The CompilerVersion constant identifies the internal version number of the Delphi compiler. It is de ...