`

FTP连接池

    博客分类:
  • java
阅读更多

开发目的:使用FTP连接池来管理FTP连接,以避免不断的连接FTP造成性能下降。

 

1、FTP连接池,建立一个java类FtpConnectionPooling:

 

package com.dripstone.ftp;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;

/**
 * <br>Title:FTP连接池
 * <br>Description:FTP连接池及FTP连接池相应的操作
 * <br>Author:张智研(zhangzhiyan@neusoft.com)
 * <br>Date:2013-7-4
 */
public abstract class FtpConnectionPooling {
    private static BlockingQueue<FtpClient> fqueue;

    private static FtpClientInfo ftpClientInfo;

    /**
     * <br>Description:初始化连接池
     * <br>Author:张智研(zhangzhiyan@neusoft.com)
     * <br>Date:2013-7-4
     * @param ftpClientInfo
     */
    public static void init(FtpClientInfo info) {
        ftpClientInfo = info;
        fqueue = new PriorityBlockingQueue<FtpClient>(ftpClientInfo.getMaxConnects(),
                new FtpClientComparator());// 初始化队列容量
        FtpClient ftpClient;
        for (int i = 0; i < ftpClientInfo.getMaxConnects(); i++) {
            ftpClient = new FtpClient();
            ftpClient.order = i;
            fqueue.add(ftpClient);
        }
    }

    public static FtpClientInfo getFtpClientInfo() {
        return ftpClientInfo;
    }

    /**
     * <br>Description:向线程池中添加FTPClient
     * <br>Author:张智研(zhangzhiyan@neusoft.com)
     * <br>Date:2013-7-4
     * @param ftpClient
     */
    public static boolean add(FtpClient ftpClient) {
        boolean b = fqueue.contains(ftpClient);
        if (!b)
            return fqueue.add(ftpClient);
        return true;
    }

    /**
     * <br>Description:获取FTPClient,如果线程池为空,则等待到FtpClientInfo中所设置的超时时间
     * <br>Author:张智研(zhangzhiyan@neusoft.com)
     * <br>Date:2013-7-4
     * @return
     * @throws InterruptedException
     */
    public static FtpClient poll() throws InterruptedException {
        return fqueue.poll(ftpClientInfo.getTimeout(), ftpClientInfo.getTimeUnit());
    }

    /**
     * <br>Description:获取FTPClient,如果线程池为空,则一直等待。
     * <br>Author:张智研(zhangzhiyan@neusoft.com)
     * <br>Date:2013-7-4
     * @return
     * @throws InterruptedException
     */
    public static FtpClient take() throws InterruptedException {
        return fqueue.take();
    }
}

 2、FtpClientProxy类

package com.dripstone.ftp;

import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;

/**
 * <br>Title:FTPClient代理类
 * <br>Description:负责FTPClient功能的代理
 * <br>Author:张智研(zhangzhiyan@neusoft.com)
 * <br>Date:2013-7-4
 */
public class FtpClientProxy {
    private FtpClient ftpClient;

    public FtpClientProxy() throws InterruptedException, SocketException, IOException {
        ftpClient = FtpConnectionPooling.poll();
        if (!ftpClient.isConnected()) {
            FtpClientInfo info = FtpConnectionPooling.getFtpClientInfo();// 获取ftpClient信息
            ftpClient.connect(info.getFtpIp(), info.getFtpPort());// 连接
            ftpClient.login(info.getFtpUserName(), info.getFtpPassword());// 登陆
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置为二进制
        }
    }

    /**
     * <br>Description:释放ftpClient
     * <br>Author:张智研(zhangzhiyan@neusoft.com)
     * <br>Date:2013-7-4
     * @return
     */
    public boolean release() {
        if (ftpClient == null)
            return true;
        boolean b = FtpConnectionPooling.add(ftpClient);
        if (b)
            ftpClient = null;
        return b;
    }

    /**
     * <br>Description:下载文件
     * <br>Author:张智研(zhangzhiyan@neusoft.com)
     * <br>Date:2013-7-4
     * @param fileName
     * @return
     * @throws IOException
     */
    public InputStream retrieveFileStream(String remote) throws IOException {
        return ftpClient.retrieveFileStream(remote);
    }

    /**
     * <br>Description:上传文件
     * <br>Author:张智研(zhangzhiyan@neusoft.com)
     * <br>Date:2013-7-4
     * @param remote
     * @param local
     * @return
     * @throws IOException
     */
    public boolean storeFile(String remote, InputStream local) throws IOException {
        return ftpClient.storeFile(remote, local);
    }

    /**
     * <br>Description:获取本地端口
     * <br>Author:张智研(zhangzhiyan@neusoft.com)
     * <br>Date:2013-7-4
     * @return
     */
    public int getLocalPort() {
        return ftpClient.getLocalPort();
    }
}

 

3、FtpClient类
package com.dripstone.ftp;

import org.apache.commons.net.ftp.FTPClient;

public class FtpClient extends FTPClient {
    public int order;
}
 4、FtpClientComparator类
package com.dripstone.ftp;

import java.util.Comparator;

public class FtpClientComparator implements Comparator<FtpClient> {

    @Override
    public int compare(FtpClient arg0, FtpClient arg1) {
        return arg0.order - arg1.order;
    }

}
 5、FtpClientInfo类
package com.dripstone.ftp;

import java.util.concurrent.TimeUnit;

public class FtpClientInfo {
    private String ftpIp; // ftp的IP地址

    private int ftpPort; // ftp的端口

    private String ftpUserName; // ftp的用户名

    private String ftpPassword; // ftp的密码

    private int maxConnects; // 最大连接数

    private long timeout; // 超时时间 ,默认60

    private TimeUnit timeUnit;// 超时时间单位,默认为秒

    public FtpClientInfo() {
        timeout = 60;
        timeUnit = TimeUnit.SECONDS;
    }

    public String getFtpIp() {
        return ftpIp;
    }

    public void setFtpIp(String ftpIp) {
        this.ftpIp = ftpIp;
    }

    public int getFtpPort() {
        return ftpPort;
    }

    public void setFtpPort(int ftpPort) {
        this.ftpPort = ftpPort;
    }

    public String getFtpUserName() {
        return ftpUserName;
    }

    public void setFtpUserName(String ftpUserName) {
        this.ftpUserName = ftpUserName;
    }

    public String getFtpPassword() {
        return ftpPassword;
    }

    public void setFtpPassword(String ftpPassword) {
        this.ftpPassword = ftpPassword;
    }

    public int getMaxConnects() {
        return maxConnects;
    }

    public void setMaxConnects(int maxConnects) {
        this.maxConnects = maxConnects;
    }

    public long getTimeout() {
        return timeout;
    }

    public void setTimeout(long timeout) {
        this.timeout = timeout;
    }

    public TimeUnit getTimeUnit() {
        return timeUnit;
    }

    public void setTimeUnit(TimeUnit timeUnit) {
        this.timeUnit = timeUnit;
    }
}
 6、测试类FtpConnectionPoolingTest
package com.dripstone.ftp;

import java.io.IOException;

public class FtpConnectionPoolingTest extends Thread {

    private static int n = 0;

    private static int m = 1;

    public void run() {
        try {
            /********************业务代码调用样例*********************/
            System.out.println(m++);
            FtpClientProxy ftpClientProxy = new FtpClientProxy();
            String t = "连接" + ++n;
            System.out.println(t + "连接成功,端口号:" + ftpClientProxy.getLocalPort());
            sleep(1000);
            System.out.println(t + "释放连接");
            ftpClientProxy.release();// 释放连接
            /***************************************************/
        } catch (InterruptedException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        /************需要在服务器启动时进行加载**************/
        FtpClientInfo ftpClientInfo = new FtpClientInfo();
        ftpClientInfo.setFtpIp("192.168.135.85");
        ftpClientInfo.setFtpPassword("test");
        ftpClientInfo.setFtpPort(21);
        ftpClientInfo.setFtpUserName("test");
        ftpClientInfo.setMaxConnects(20);
        FtpConnectionPooling.init(ftpClientInfo);
        /*******************************************/

        /*************************************************************/
        try {
            FtpClientProxy ftpClientProxy1 = new FtpClientProxy();
            System.out.println("本地端口" + ftpClientProxy1.getLocalPort());
            ftpClientProxy1.release();
            ftpClientProxy1.release();
            FtpClientProxy ftpClientProxy2 = new FtpClientProxy();
            System.out.println("本地端口" + ftpClientProxy2.getLocalPort());
            ftpClientProxy2.release();
        } catch (InterruptedException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        /*************************并发测试*******************************/
        for (int i = 1; i <= 40; i++) {
            FtpConnectionPoolingTest test = new FtpConnectionPoolingTest();
            test.start();
        }
    }
}
 
分享到:
评论

相关推荐

    ftp连接池实例

    其实ftp连接池跟数据库连接池的原理是差不多的,不同的是ftp连接池有个连接时间的限制,如果你没设置的话,它的默认连接服务器的时间是0,所以我们要合理的设置它的服务器的时间,ftp.setConnectTimeout(5000);...

    SpringBoot2.2+commons-pool2实现多Ftp连接池完整项目,开箱即用,经过长期生产使用稳定可靠

    使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...

    java ftp连接池

    在网上找了好久没有现成的ftp连接池jar包,自己花了一些时间实现了一个简单的连接池,用了一段时间稳定性还可以。

    springboot集成ftp连接池工具

    springboot集成ftp连接池工具,很好的解决了并发大用户上传附件慢的问题

    FTPClient连接池

    基于SpringBoot搭建 使用apache的commons-pool2 构建 FTPClient连接池 有FtpClientFactory、FtpClientPool、FtpConfig、...还有ftp连接池的一些配置参数信息在ftp.properties文件中 注释完整欢迎大家下载使用

    使用servicemix实现FTP连接池

    NULL 博文链接:https://log-cd.iteye.com/blog/1886142

    java ftpClient 连接池设计

    1 博文链接:https://bai2mumu.iteye.com/blog/2231916

    java ftp服务器实例

    包含java ftp服务器端源程序。对初学很有用

    Spring Boot整合FTPClient线程池的实现示例

    主要介绍了Spring Boot整合FTPClient线程池的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    ftp-pool-0.0.1-SNAPSHOT.jar

    ftp连接池java实现,使用方法可看我的博客介绍,通过配置xml文件和配置一个FtpConfig就可以使用 https://blog.csdn.net/weixin_37817685/article/details/106744551

    goftp:用于golang的FTP客户端

    以下是一些值得注意的软件包亮点: 用于并行传输/遍历的连接池。 自动恢复插补的文件传输。 显式和隐式FTPS支持(仅TLS,无SSL)。 IPv6支持。 针对pure-ftpd和proftpd运行的合理的良好自动化测试。 请参阅godocs...

    java动态代理实现数据库连接池

    java动态代理实现数据库连接池的详细原理讲解

    Java FTPClient连接池的实现

    主要介绍了Java FTPClient连接池的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    易语言FTP管理

    易语言FTP管理源码系统结构:连接FTP,取FTP文件,加逗号,取文件后缀,日志,加入日志,简化时间,取上级目录,取本地上级目录,枚举驱动器,浏览文件,清空FTP目录,FTP下载文件,FTP路径替换,执行列

    ftp-pool1.zip

    ### 一. 连接池概述 ...每次访问只需从连接池里获取连接,使用完毕后再放回连接池,并不是直接关闭连接, 这样可以保证程序重复使用同一个连接而不需要每次访问都建立和关闭连接, 从而提高系统性能。

    ftp搭载资源文件用于搭载ftp.txt

    点击打开连接框下面的本地主机主页,然后可以看到应用程序池和网站选项,我们右键点击网站选择添加网站。然后在弹出的添加网站框里面输入我们的网站名称,物理路径也就是我们的FTP本地文件夹,我们可以在磁盘里面...

    sftp连接池和springboot启动器.rar

    sftp 命令可以通过 ssh 来上传和下载文件,是常用的文件传输工具,它的使用方式与 ftp 类似,但它使用 ssh 作为底层传输协议,所以安全性比 ftp 要好得多。 常用方式 格式:sftp 通过 sftp 连接 ,端口为默认的 ...

    java的ftp多线程下载

    本程序是在原有基础上逐步完善的,第一版:http://download.csdn.net/detail/zpwmhx/4342943 第二版:http://download.csdn.net/detail/zpwmhx/4505209 ...本程序很适合在主机间批量传输文件和目录,参数可控

    rewin.zwgtools.code.jar

    rewin.zwgtools.code....读写xml文档,图片管理,Ftp管理,可以和一个Ftp服务端建立连接实现文件的上传下载,TSF服务提供,两个数据库连接池管理,Socket连接池的管理,等等,皆在为开发人员提供高度集成的开发工具。

Global site tag (gtag.js) - Google Analytics