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 ...
随机推荐
- 经典SQL面试题(转)
以下题目都在MySQL上测试可行,有疏漏或有更优化的解决方法的话欢迎大家提出,我会持续更新的:) 有三个表,如果学生缺考,那么在成绩表中就不存在这个学生的这门课程成绩的记录,写一段SQL语句,检索出每 ...
- JS_高程5.引用类型(5)Array类型的操作方法
一.操作方法 1.concat()方法 基于当前数组中的所有项创建一个新数组.具体说,是先创建当前数组的一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组.在没有给concat() ...
- Mac安装Linux的KVM管理工具virt-manager
安装: brew tap jeffreywildman/homebrew-virt-manager brew install virt-manager virt-viewer 中途会碰到很多问题,可以 ...
- SpringBoot无废话入门04:MyBatis整合
1.Parent引入及pom配置 首先,如果要支持mybatis,那么我们就应该引入mybatis的starter.同时,由于连接本身还需要用jdbc的connetor和连接池,所以一并需要引入这些依 ...
- ElasticSearch的基本原理与用法
一.简介 ElasticSearch和Solr都是基于Lucene的搜索引擎,不过ElasticSearch天生支持分布式,而Solr是4.0版本后的SolrCloud才是分布式版本,Solr的分布式 ...
- centos找不到环境变量 -bash: ls: command not found
#在系统中输入命令,报如下错误: [root@a1 work]# ll-bash: ls: command not found #昨时解决办法:export PATH=/usr/local/sbin: ...
- Java 并发编程(二)对象的不变性和安全的公布对象
一.不变性 满足同步需求的还有一种方法是使用不可变对象(Immutable Object). 到眼下为止,我们介绍了很多与原子性和可见性相关的问题,比如得到失效数据.丢失更新操作或光查到某个对象处于不 ...
- CentOS 6.5 x64下安装VMware tools
[root@CentOS6 /]# mount /dev/cdrom /mnt mount: block device /dev/sr0 is write-protected, mounting re ...
- Beautiful Soup 解决爬虫编码格式问题,Beautiful Soup编码格式
一. 为什么要用解析框架 bs4 我觉得爬虫最难得问题就是编码格式,因为你不知道要爬取目标网站的编码格式,有可能是Unicode,utf-8, ASCII , gbk格式,但是使用Beautiful ...
- mysql索引知识简单记录
简介 今天记录下索引基础知识 1.mysql单表最多支持多少个索引,索引总长度为多少? 索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型. ...