Quartz石英调度实现ftp文件上传

实现一个每月1号00点01分自动生成的文件,通过ftp传到另一台主机上

1.先创建一个job任务类FtpUploadFileJobTask

importjava.io.ByteArrayInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStream;importorg.apache.commons.net.ftp.FTPClient;importorg.apache.commons.net.ftp.FTPReply;publicclassFtpUploadFileJobTask{privateFTPClientftpClient;/***实现任务的方法*/publicvoidexecute(){StringfileName="xxx.avl";Stringusername="username";Stringpassword="password";//目标主机IPStringip="192.168.137.2";intport=21;//上传到主机的文件路径Stringremotepath="/xxxx/src/MHTOSTA/";try{//16进制01作为数据分隔符byte[]b1={0x01};Stringb1Str=newString(b1);StringBuffersb=newStringBuffer();StringtitleStr="用户ID"+b1Str+"订单生成时间"+b1Str+"月份"+b1Str+"代理商编码"+b1Str+"推荐工号"+"\r\n";sb.append(titleStr);//内容追加省略。。。booleanconnetFlag=getConnetFTP(ip,port,username,password,remotepath,fileName);if(connetFlag){//上传数据文件uploadFile(remotepath,fileName,newByteArrayInputStream((sb.toString()).getBytes("GBK")));}}catch(Exceptione){e.printStackTrace();}finally{//关闭连接ftpLogOut();}}/***ftp上传文件*@parampath*@paramfilename*@paraminput*@return*/publicbooleanuploadFile(Stringpath,//FTP服务器保存目录Stringfilename,//上传到FTP服务器上的文件名InputStreaminput//输入流){booleanisLogin=false;try{//创建目录,转移工作目录至指定目录下createDirs(path);isLogin=this.ftpClient.storeFile(filename,input);if(!isLogin){this.ftpClient.disconnect();returnisLogin;}isLogin=true;}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}finally{if(input!=null)try{input.close();}catch(IOExceptione){e.printStackTrace();}}returnisLogin;}/***ftp链接**@paramhostname*@paramport*@paramusername*@parampassword*@parampath*@paramfilename*@return*/publicbooleangetConnetFTP(Stringhostname,//FTP服务器hostnameintport,//FTP服务器端口Stringusername,//FTP登录账号Stringpassword,//FTP登录密码Stringpath,//FTP服务器保存目录Stringfilename//上传到FTP服务器上的文件名)throwsIOException{booleanisLogin=false;this.ftpClient=newFTPClient();intreply;if(port>0){this.ftpClient.connect(hostname,port);//连接FTP服务器}else{this.ftpClient.connect(hostname);}//如果采用默认端口,可以使用ftp.connect(ftp)的方式直接连接FTP服务器this.ftpClient.login(username,password);//登录//检验是否连接成功reply=this.ftpClient.getReplyCode();if(!FTPReply.isPositiveCompletion(reply)){System.out.println("ftp链接失败>>>");this.ftpClient.disconnect();returnisLogin;}//使用二进制保存方式,没有设置在linux系统下换行“\r\n”不起作用this.ftpClient.setFileType(this.ftpClient.BINARY_FILE_TYPE);isLogin=true;returnisLogin;}/***@退出关闭服务器链接**/publicvoidftpLogOut(){if(null!=this.ftpClient&&this.ftpClient.isConnected()){try{booleanreuslt=this.ftpClient.logout();//退出FTP服务器if(reuslt){}}catch(IOExceptione){e.printStackTrace();}finally{if(this.ftpClient.isConnected()){try{this.ftpClient.disconnect();//关闭FTP服务器的连接}catch(IOExceptione){e.printStackTrace();}}}}}/***创建目录*@paramremoteUpLoadPath*@throwsIOException*/publicvoidcreateDirs(StringremoteUpLoadPath)throwsIOException{String[]dirs=remoteUpLoadPath.split("/");//移动到linux系统的根目录下,注:这段代码在window系统上执行代码会报错。this.ftpClient.changeWorkingDirectory("/");for(Stringdir:dirs){this.ftpClient.mkd(dir);this.ftpClient.changeWorkingDirectory(dir);}}}


这里仅是通过ftp在目标主机上生产文件,并把数据直接写入生成的文件中。

如果需要在项目主机上先生成文件在通过ftp传到目标主机上,则可以通过以下代码实现:


先将数据写入文件:

/***数据写入到文件*@paramcontent*/publicvoidwriterFileDate(Stringcontent,StringfileName,booleanwriteflag){BufferedWriterbw=null;try{bw=newBufferedWriter(newOutputStreamWriter(newFileOutputStream(fileName,writeflag)));bw.write(content);}catch(Exceptione){e.printStackTrace();}finally{try{if(bw!=null){bw.close();//关闭输出流}}catch(IOExceptione){e.printStackTrace();}}}/***创建文件路径,并获取文件名*@return*/publicStringgetCreateFile(Stringpath,StringfileName){Filefile=newFile(path+fileName);if(!file.exists()){//文件不存在file.getParentFile().mkdirs();//创建文件目录}returnpath+fileName;}

调用写入数据方法

//context:数据内容this.writerFileDate(context,this.getCreateFile(localpath,fileName),false);

生成文件后,在通过ftp传到目标主机,关键代码如下:

FileInputStreamin=null;try{in=newFileInputStream(newFile(localpath+fileName));booleanuploadflag=uploadFile(ip,port,username,password,remotepath,fileName,in);if(uploadflag){System.out.println("ftp上传文件成功>>>");}}catch(FileNotFoundExceptione){e.printStackTrace();}

上传方法:

publicbooleanuploadFile(Stringhostname,//FTP服务器hostnameintport,//FTP服务器端口Stringusername,//FTP登录账号Stringpassword,//FTP登录密码Stringpath,//FTP服务器保存目录Stringfilename,//上传到FTP服务器上的文件名InputStreaminput//输入流){booleanisLogin=false;FTPClientftp=newFTPClient();try{intreply;if(port>0){ftp.connect(hostname,port);//连接FTP服务器}else{ftp.connect(hostname);//默认端口可以这样链接}//如果采用默认端口,可以使用ftp.connect(ftp)的方式直接连接FTP服务器ftp.login(username,password);//登录//检验是否连接成功reply=ftp.getReplyCode();if(!FTPReply.isPositiveCompletion(reply)){ftp.disconnect();returnisLogin;}System.out.println("ftp链接成>>>>>>>>>>>>");//FTPFile[]files=ftp.listFiles();//for(FTPFilefile:files){//file.isFile();//file.getName();//file.getTimestamp();//}//创建目录,转移工作目录至指定目录下ftp=createDirs(path,ftp);////转移工作目录至指定目录下//isLogin=ftp.changeWorkingDirectory(path);//log.info("pIsSuc:"+isLogin);//if(!isLogin){//ftp.disconnect();//returnisLogin;//}isLogin=ftp.storeFile(filename,input);if(!isLogin){System.out.println("ftp上传文件失败:"+isLogin+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");ftp.disconnect();returnisLogin;}isLogin=true;}catch(FileNotFoundExceptione){//后面代码省略。。。。


2.在applicationContext.xml中配置定时任务的时间,关键代码如下:

<!--定时生成报表文件--><beanid="ftpUploadFileJobTask"class="com.quartz.FtpUploadFileJobTask"><propertyname="testService"><refbean="testService"/></property></bean><beanid="ftpUploadFileJobBean"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><propertyname="targetObject"ref="ftpUploadFileJobTask"/><propertyname="targetMethod"value="execute"/></bean><beanid="ftpUploadFileQuartTime"class="org.springframework.scheduling.quartz.CronTriggerBean"lazy-init="false"autowire="no"><propertyname="jobDetail"><refbean="ftpUploadFileJobBean"/></property><!--0101*?==0:秒,1:分,0:时,1:号,*:每个月,?星期几--><propertyname="cronExpression"value="0101*?"/><!--每月的1号的00点01分执行--></bean><beanclass="org.springframework.scheduling.quartz.SchedulerFactoryBean"><propertyname="triggers"><list><refbean="ftpUploadFileQuartTime"/></list></property></bean>