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 ...
随机推荐
- NodeJS 连接接MySQL
NodeJS 连接接MySQL MySQL是常用数据库,作为后端模块,nodejs可以提供了mysql接口 安装 $ npm install mysql 测试代码 var mysql = requir ...
- 自定义simple_tag和filter在html中渲染出来的联系和区别
关于 simple_tag: 1,在app下创建一个(templatetags)目录,(被引用的模块必须放在该目录下,且目录名称不可更改): 2,创建任意py文件: 3,创建template对象: f ...
- JDBC(11)—数据库连接池
在实际开发过程中,特别是在web应用系统中,如果程序直接访问数据库中的数据,每一次数据访问请求丢必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接.而连接并打开数据库是一件既消费资源又费时的 ...
- Introducing stapbpf – SystemTap’s new BPF backend
https://developers.redhat.com/blog/2017/12/13/introducing-stapbpf-systemtaps-new-bpf-backend/
- Java知识回顾 (10) 线程
再次声明,正如(1)中所描述的,本资料来自于runoob,略有修改. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. Java 给多线程编程提供了内 ...
- 已安装nginx动态添加模块
说明:已经安装好的nginx,需要添加一个未被编译安装的模块,需要怎么弄呢? 具体:这里以安装第三方ngx_http_google_filter_module模块为例nginx的模块是需要重新编译ng ...
- Python3爬虫实例 代理的使用
现在爬虫越来越难了,一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问. 所以我们需要设置一些代理服 ...
- 理解Java注解类型
一. 理解Java注解 注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类.而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy ...
- WPF宝典Url
https://sourceforge.net/directory/os:windows/https://archive.codeplex.com/ https://code.msdn.microso ...
- PHP-问题处理Fatal error: Uncaught Error: Call to undefined function simplexml_load_file()
1.问题 今天重新安装了ubuntu,PHP,MySQL,Apache,到测试CMS项目时发生一个错误: Fatal error: Uncaught Error: Call to undefined ...