一、背景
为了提升平台相关业务的下载升级速率,并且做到更好控制下载升级过程,将下载进度推送至平台项目中,则集成引入Apache FtpServer。
二、FTP介绍
FTP 是FileTransfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序 (Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。
三、了解Apache FtpServer
Apache Ftp Server 是100%纯Java的FTP服务器软件,遵守FTP命令协议基础的前提下,它采用MINA网络框架开发,具有非常好的性能。Apache FtpServer 既可以嵌到Java应用中使用,也可以做为Windows服务或Unix/Linux Daemon单独运行。此外还提供与Spring 相集成的模块,在本案例中是通过与spring框架的融合来完成与内部平台项目的集成的。
四、集成工作前奏
(1)准备相关jar包
ftpserver-core-1.0.6.jar
ftplet-api-1.0.6.jar
mina-core-2.0.4.jar
-可到专门的jar包网站下载,通过Maven方式配置导入
(2)jar包解读
ftpserver-core.jar包提供了关于FTP服务XML文件配置的结构定义ftpserver-1.0.xsd(xsd:XMLSchemasDefinition,XML结构定义),便于与spring框架的融合。
ftpserver-1.0.xsd文件提供了一些配置标签,有兴趣可自行探究。
五、集成工作-spring容器中配置服务(applicationFTP.xml)
(1)定义ftp server
(2)配置FTP服务地址,监听器(继承DefaultFtplet)
(3)配置FTP用户数据管理-数据源、SQL操作逻辑
(4)在程序加载处(spring.xml)引入applicationFTP.xml,并配置FTP服务bean工厂
注:myFtpServerFactory是我项目中自己定义的bean工厂
(5)通过FTP服务bean工厂,启动FTP服务
六、定义FtpServiceOperationMonitor监听的事件,继承DefaultFtple,(重写父类DefaultFtplet的一些方法)
七、功能扩展(平台任务升级功能)
(1)添加FTP用户
(2)计算下载进度、速度、剩余时间
(3)取消下载
(4)断点续传时的下载进度、速度、剩余时间
(1)添加FTP用户
根据源码“ftpserver-core-1.0.6.jar”包提供的相关类和方法,自定义添加FTP用户功能方法
(2) 计算下载进度、速度、剩余时间
首先了解到FTP下载的命令是”RETR“,从源码“ftpserver-core-1.0.6.jar”包中找到此命令类(org.apache.ftpserver.command.impl.RETR)。
解读RETR类,“long transSz = dataConnection.transferToClient(session.getFtpletSession(), is)”这句代码的意思就是传输到客户端,顾名思义就是“下载”,最后下载过程的实现方式便定位到org.apache.ftpserver.impl.IODataConnection类的transfer方法。
修改transfer方法代码,实现每传输固定大小(比如0.125兆)计算一次下载进度、速度、剩余时间,并通过redis工具推送到中心平台。
注:这边推送计算结果到平台项目中使用的redis,redis的可靠性不高,应用可靠性更高的kafka或RocketMQ。
(3) 在下载开始前onDownloadStart的监听方法中加入记录当前会话的IO连接工厂:
提供取消下载接口:
(4)断点续传时的下载进度、速度、剩余时间
在接收命令后afterCommand监听方法中先判断是否收到断点续传命令”REST”:
在开始下载前onDownloadStart前监听方法中记录此次需要断点续传文件的总大小:
在传输文件过程的transfer方法中:
八、内部平台操作
做相关数据(下载进度)推送的监听,做好内部关联,结合自己平台做好集成设计。
附架构图:



