FTP下载类:
package com.log.generateXML.util;>
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.LogFactoryImpl;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import com.log.generateXML.dao.LogTableDao;
import com.log.generateXML.dao.impl.LogTableDaoImpl;
import com.novomss.idc.entity.FtpDownloadLog;
/***
* 功能描述:FTP下载文件类
* 定时任务配置applicationContext-idc-uploadTimer.xml
*
*/
public class DownLoadXML {
private LogTableDao lts;
// 日志记录对象
private final Log log = LogFactoryImpl.getLog(DownLoadXML.class);
// Xmls下载日志记录
private FtpDownloadLog ftpdown ;
// FTP主机
private String ftpHost = null;
// FTP连接端口
private String port = null;
private int ftpPort ;
// FTP连接用户
private String ftpuser = null;
// FTP用户密码
private String ftppasswd = null;
// FTP下载描述
private String descript ;
// FTP上传成功与否状态
private int status;
// 假定错误值
/***
* 1 FTP登陆状态失败
* 2 FTP目录设置错误
* 3 FTP工作路径切换失败
* 4 要下载的文件不存在
*/
private int flag;
/****
* FTP下载
* @param filename
* @return
* @throws Exception
*/
public boolean ftpDownload(String filename) throws Exception {
// 如果参数为空,直接返回提示
if(filename==null || filename ==""){
log.info( "filename is null.");
return false;
}
// 保存文件路径
String downsavefilePath = FtpConfig.getValue("localDir"); // 本地存储目录
if(downsavefilePath == null || downsavefilePath.length() == 0){
log.info("本地存储目录属性未设置!");
return false;
}
File downfilePath = new File(downsavefilePath);
if(!downfilePath.exists()&&!downfilePath.isDirectory()){
log.info("本地下载文件保存路径不存在!");
return false;
}
// 下载文件名
File file = new File(filename);
// 实例化FTP客户端对象
FTPClient ftp = new FTPClient();
// 服务器连接状态
int reply = 0;
try {
// 如果FTP未连接则连接服务器
if (!ftp.isConnected()) {
// 设置连接属性
ftpHost = FtpConfig.getValue("ftpHost");
port = FtpConfig.getValue("ftpPort");
ftpPort = Integer.parseInt(port);
// 连接服务器
ftp.connect(ftpHost,ftpPort);
log.info("连接ftp服务器:" + ftpHost);
// 连接服务器状态
reply = ftp.getReplyCode();
log.info("连接ftp服务器reply:" + reply);
}
// 登陆服务器,判断是否登陆成功
ftpuser = FtpConfig.getValue("userName");
ftppasswd = FtpConfig.getValue("password");
boolean isLogin = ftp.login(ftpuser,ftppasswd); // 登陆FTP用户名、密码
//log.info("登录ftp服务器isLogin:" + isLogin);
if(!isLogin){
log.info("登陆FTP失败");
flag = 1;
}else{ log.info("登陆FTP已成功"); }
// 获取FTP工作目录
String workDir = FtpConfig.getValue("workDir");
if (workDir == null){
log.info("workdir is null.");
flag = 2;
}
// 上传目录
String uploadDir = "";
// 拼接FTP工作路径
uploadDir += "" + workDir;
// 切换当前工作路径,更改FTP连接位置
boolean change = ftp.changeWorkingDirectory(uploadDir);
if(change == false){
log.info("changeWorkingDirectory: “"+uploadDir+"” failed.");
flag=3;
}
log.info("切换工作路径状态:"+change);
// 获得下载开始时间
long starTime = System.currentTimeMillis();
// 初始化文件名,获得当前目录文件
String savedFileName = "";
savedFileName = file.getName();
if(savedFileName==null || savedFileName.length()==0){
log.info("get file “"+savedFileName+"” failed.");
flag=4;
}
/*//验证服务器端文件是否存在
FileOutputStream fos = new FileOutputStream(savedFileName);
if(ftp.retrieveFile(filename, fos)){
log.info("服务器端文件已验证存在:");
}else {
flag=4;
log.info("要下载的文件服务器端不存在:");
}*/
// 文件流保存路径
File tempFile = new File(downsavefilePath+"temp_"+savedFileName);
File destFile = new File(downsavefilePath+savedFileName);
//输出流,输出文件内容到临时文件
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tempFile));
// 设置文件类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.setBufferSize(4 * 1048);
ftp.setControlEncoding("GB2312");
ftp.enterLocalPassiveMode();
// 下载XML文件,从服务器检索指定文件savedFileName,并写入BufferedOutputStream
boolean download = ftp.retrieveFile(savedFileName, bos);
// 当前FTP状态
reply = ftp.getReplyCode();
bos.close();
log.info("文件下载:" + download + "时间为:"+ (System.currentTimeMillis() - starTime) + "ms");
//保存文件到指定目标目录
if(download){
if(destFile.exists())
destFile.delete();
tempFile.renameTo(destFile);
status = 1;
descript = "文件下载成功!";
log.info("文件下载成功!");
}else {
tempFile.delete();
status = 0;
if(flag==1) descript="FTP登陆状态失败";
if(flag==2) descript="FTP目录设置错误";
if(flag==3) descript="FTP工作路径切换失败";
if(flag==4) descript="要下载的文件不存在";
log.info( "download: “"+destFile.getPath()+"” faild." );
}
//写入成功日志并加入告警
lts = new LogTableDaoImpl();
ftpdown = new FtpDownloadLog();
ftpdown.setFilename(filename);
ftpdown.setFtphost(ftpHost);
ftpdown.setFtpport(Long.valueOf(port));
ftpdown.setFtpuser(ftpuser);
ftpdown.setFtppasswd(ftppasswd);
ftpdown.setLocaldir(downsavefilePath);
ftpdown.setWorkdir(workDir);
ftpdown.setDescript(descript);
ftpdown.setStatus(Long.valueOf(status));
boolean flag = lts.saveFtpDownLog(ftpdown);
if(flag)
log.info("写入日志成功!");
log.info("接收下载文件的参数:"+ftpdown.getFilename());
//下载失败返回false
if(status==0)
return false;
// 判断FTP连接性
if (!FTPReply.isPositiveCompletion(reply)) {
System.err.println("FTP server reply." + reply);
}
// 退出登陆
ftp.logout();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} finally {
ftp.disconnect(); // 释放FTP连接
}
return true;
}
/*public static void main(String[] args) throws Exception{
DownLoadXML dlx = new DownLoadXML();
String filename = "20121119999.xml-";
boolean a = dlx.ftpDownload(filename);
System.out.println("返回:"+a);
}*/
public LogTableDao getLts() {
return lts;
}
public void setLts(LogTableDao lts) {
this.lts = lts;
}
}
定时任务配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 定时上传-->
<bean id="uploadTimer" class="com.generatexml.UploadTimer">
<property name="generator" ref="generator" />
</bean>
<!-- 定时下载-->
<bean id="downloadTimer" class="com.log.generateXML.DownloadTimer">
</bean>
<!-- 定时处理计费数据业务方法 -->
<bean id="ccTimer"
class="com.timer.CalcChargeTimer">
<!-- 注入方法,引用 -->
</bean>
<!-- 定时调度 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="loadTask"/>
<ref local="loadCc" />
<ref local="ddownTask"/>
</list>
</property>
</bean>
<bean id="loadTask" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail"><ref bean="jobTask"/></property>
<property name="cronExpression">
<!--<value>0 0/2 * * * ?</value>-->
<value>0 10 0 * * ?</value>
</property>
</bean>
<bean id="jobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--具体执行类 -->
<property name="targetObject" ref="uploadTimer" />
<!--执行类的方法名称-->
<property name="targetMethod"><value>run</value></property>
</bean>
<!-- XML定时 调用文件下载方法 -->
<bean id="downTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--具体执行类 -->
<property name="targetObject" ref="downloadTimer" />
<!--执行类的方法名称-->
<property name="targetMethod"><value>down</value></property>
</bean>
<!-- XML定时任务时间配置 秒 分 时 * * ? 每天几点几分执行 -->
<bean id="ddownTask" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail"><ref bean="downTask"/></property>
<property name="cronExpression">
<!--<value>0 0/2 * * * ?</value>-->
<value>0 0 2 * * ?</value>
</property>
</bean>
<!-- 任务执行,执行日期 1秒 2分 3时 4日 5月 6星期几 1-7 or SUN 7年份 -->
<bean id="loadCc" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail"><ref bean="jobCc"/></property>
<property name="cronExpression">
<value>0 0 1 1 * ?</value>
</property>
</bean>
<bean id="jobCc" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"><ref bean="ccTimer"/></property><!--具体执行类 -->
<property name="targetMethod"><value>operatorData</value></property> <!--执行类的方法名称-->
</bean>
</beans>