开发目的:使用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类
相关推荐
Java FTP连接池是一种用于管理FTP(文件传输协议)连接的资源池,它的主要目标是提高应用程序的性能和效率。在传统的FTP操作中,每次需要连接到FTP服务器时都会创建一个新的连接,这会消耗大量时间和系统资源。而...
其实ftp连接池跟数据库连接池的原理是差不多的,不同的是ftp连接池有个连接时间的限制,如果你没设置的话,它的默认连接服务器的时间是0,所以我们要合理的设置它的服务器的时间,ftp.setConnectTimeout(5000);...
使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...
本文将深入探讨如何在Spring Boot项目中集成FTP连接池,以解决并发用户上传附件时的性能问题。 首先,我们需要引入相关的依赖。在Spring Boot项目中,可以使用Apache Commons Net库来实现FTP功能,并使用Apache ...
标题“使用servicemix实现FTP连接池”指的是在Java环境中利用Apache ServiceMix框架来创建一个FTP连接池,以提高FTP客户端的性能和资源管理效率。ServiceMix是Apache软件基金会的一个开源企业服务总线(ESB),它...
基于SpringBoot搭建 使用apache的commons-pool2 构建 FTPClient连接池 有FtpClientFactory、FtpClientPool、FtpConfig、...还有ftp连接池的一些配置参数信息在ftp.properties文件中 注释完整欢迎大家下载使用
* 自定义实现 ftp 连接池 * @Auther: hrabbit */ public class FTPClientPool { // FTPClient 对象池 private GenericObjectPool<FTPClient> pool; // 构造函数 public FTPClientPool(FTPProperties ...
连接池允许程序重复使用已经建立的FTP连接,避免了频繁创建和关闭连接带来的开销,提升了整体的运行效率。本篇文章将深入探讨如何设计一个基于Java的FTPClient连接池。 首先,我们需要理解FTPClient的基本用法。...
Java FTPClient连接池的实现 在这篇文章中,我们主要介绍了Java FTPClient连接池的实现。首先,我们需要了解为什么需要使用连接池。创建和销毁FTPClient对象是非常耗费资源的操作,因此,我们可以使用连接池来复用...
在Java FTP服务器实现中,`java.net.ServerSocket`和`java.net.Socket`类用于创建服务器端和客户端的连接。`java.io`包下的`InputStream`和`OutputStream`则用于处理数据的读写。 FTP服务器的核心在于管理用户连接...
### Java动态代理实现数据库连接池 #### 背景与挑战 在开发应用程序时,数据库连接池是一个常用且重要的组成部分。频繁地建立和断开数据库连接不仅效率低下,还可能导致性能瓶颈。为了解决这一问题,引入了数据库...
标题 "JMeter测试有无数据库连接池的性能" 涉及到的关键知识点主要集中在性能测试工具Apache JMeter以及数据库连接池在系统性能优化中的作用。这篇博客文章可能通过使用JMeter来比较系统在使用和不使用数据库连接池...
同时,你还可以优化`FtpUtils`类,例如使用FTP连接池来管理多个并发的上传任务。 最后,别忘了在Spring MVC的配置中,注册`FileUploadController`,以便处理器能正确处理文件上传请求。这通常在`@Configuration`类...
此外,使用线程安全的类管理FTP连接池可以避免并发访问时的问题。 总的来说,Java中的FTP文件上传和下载涉及了网络编程、文件I/O以及第三方库的使用。通过Apache Commons Net库,我们可以方便地实现这些功能,同时...
ftp连接池java实现,使用方法可看我的博客介绍,通过配置xml文件和配置一个FtpConfig就可以使用 https://blog.csdn.net/weixin_37817685/article/details/106744551
以下是一些值得注意的软件包亮点: 用于并行传输/遍历的连接池。 自动恢复插补的文件传输。 显式和隐式FTPS支持(仅TLS,无SSL)。 IPv6支持。 针对pure-ftpd和proftpd运行的合理的良好自动化测试。 请参阅godocs...
Java网络编程是构建分布式应用程序的关键技术,特别是在服务器端开发中,多线程和连接池是其核心概念。本文将深入探讨这两个主题,并结合文件传输的实际应用进行讲解。 首先,我们来理解多线程。在Java中,多线程...
Java实现的FTP(File ...总的来说,Java实现的FTP连接与数据浏览程序涉及网络编程、文件操作、流处理、错误处理等多个方面的知识。通过合理的编程实践和第三方库,我们可以构建出稳定、高效、功能丰富的FTP客户端。
sftp 命令可以通过 ssh 来上传和下载文件,是常用的文件传输工具,它的使用方式与 ftp 类似,但它使用 ssh 作为底层传输协议,所以安全性比 ftp 要好得多。 常用方式 格式:sftp 通过 sftp 连接 ,端口为默认的 ...