您好,登錄后才能下訂單哦!
Quartz石英調度實現ftp文件上傳
實現一個每月1號00點01分自動生成的文件,通過ftp傳到另一臺主機上
1.先創建一個job任務類FtpUploadFileJobTask
import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; public class FtpUploadFileJobTask{ private FTPClient ftpClient; /** * 實現任務的方法 */ public void execute() { String fileName = "xxx.avl"; String username = "username"; String password ="password"; //目標主機IP String ip = "192.168.137.2"; int port =21; //上傳到主機的文件路徑 String remotepath="/xxxx/src/MHTOSTA/"; try { //16進制01作為數據分隔符 byte[] b1 = {0x01}; String b1Str = new String(b1); StringBuffer sb = new StringBuffer(); String titleStr = "用戶ID"+b1Str+"訂單生成時間"+b1Str+"月份"+b1Str+"代理商編碼"+b1Str+"推薦工號"+"\r\n"; sb.append(titleStr); //內容追加省略。。。 boolean connetFlag= getConnetFTP(ip, port, username, password, remotepath, fileName); if(connetFlag){ //上傳數據文件 uploadFile(remotepath, fileName, new ByteArrayInputStream((sb.toString()).getBytes("GBK"))); } } catch (Exception e) { e.printStackTrace(); }finally{ //關閉連接 ftpLogOut(); } } /** * ftp上傳文件 * @param path * @param filename * @param input * @return */ public boolean uploadFile( String path, // FTP服務器保存目錄 String filename, // 上傳到FTP服務器上的文件名 InputStream input // 輸入流 ) { boolean isLogin = false; try { //創建目錄,轉移工作目錄至指定目錄下 createDirs(path); isLogin = this.ftpClient.storeFile(filename, input); if (!isLogin) { this.ftpClient.disconnect(); return isLogin; } isLogin = true; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (input != null) try { input.close(); } catch (IOException e) { e.printStackTrace(); } } return isLogin; } /** * ftp鏈接 * * @param hostname * @param port * @param username * @param password * @param path * @param filename * @return */ public boolean getConnetFTP(String hostname,// FTP服務器hostname int port,// FTP服務器端口 String username, // FTP登錄賬號 String password, // FTP登錄密碼 String path, // FTP服務器保存目錄 String filename // 上傳到FTP服務器上的文件名 ) throws IOException{ boolean isLogin = false; this.ftpClient = new FTPClient(); int reply; 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(); return isLogin; } //使用二進制保存方式,沒有設置在linux系統下換行“\r\n”不起作用 this.ftpClient.setFileType(this.ftpClient.BINARY_FILE_TYPE); isLogin = true; return isLogin; } /** * @退出關閉服務器鏈接 * */ public void ftpLogOut() { if (null != this.ftpClient && this.ftpClient.isConnected()) { try { boolean reuslt = this.ftpClient.logout();// 退出FTP服務器 if (reuslt) { } } catch (IOException e) { e.printStackTrace(); } finally { if(this.ftpClient.isConnected()){ try { this.ftpClient.disconnect();// 關閉FTP服務器的連接 } catch (IOException e) { e.printStackTrace(); } } } } } /** * 創建目錄 * @param remoteUpLoadPath * @throws IOException */ public void createDirs(String remoteUpLoadPath) throws IOException { String[]dirs = remoteUpLoadPath.split("/"); //移動到linux系統的根目錄下,注:這段代碼在window系統上執行代碼會報錯。 this.ftpClient.changeWorkingDirectory("/"); for(String dir : dirs){ this.ftpClient.mkd(dir); this.ftpClient.changeWorkingDirectory(dir); } } }
這里僅是通過ftp在目標主機上生產文件,并把數據直接寫入生成的文件中。
如果需要在項目主機上先生成文件在通過ftp傳到目標主機上,則可以通過以下代碼實現:
先將數據寫入文件:
/** * 數據寫入到文件 * @param content */ public void writerFileDate(String content,String fileName,boolean writeflag){ BufferedWriter bw = null; try { bw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(fileName,writeflag))); bw.write(content); } catch (Exception e) { e.printStackTrace(); }finally{ try { if(bw!=null){ bw.close();// 關閉輸出流 } } catch (IOException e) { e.printStackTrace(); } } } /** * 創建文件路徑,并獲取文件名 * @return */ public String getCreateFile(String path,String fileName){ File file = new File(path+fileName); if(!file.exists()){//文件不存在 file.getParentFile().mkdirs();//創建文件目錄 } return path+fileName; }
調用寫入數據方法
//context:數據內容 this.writerFileDate(context, this.getCreateFile(localpath,fileName),false);
生成文件后,在通過ftp傳到目標主機,關鍵代碼如下:
FileInputStream in=null; try { in = new FileInputStream(new File(localpath + fileName)); boolean uploadflag=uploadFile(ip, port, username, password, remotepath, fileName, in); if(uploadflag){ System.out.println("ftp上傳文件成功>>>"); } } catch (FileNotFoundException e) { e.printStackTrace(); }
上傳方法:
public boolean uploadFile(String hostname,// FTP服務器hostname int port,// FTP服務器端口 String username, // FTP登錄賬號 String password, // FTP登錄密碼 String path, // FTP服務器保存目錄 String filename, // 上傳到FTP服務器上的文件名 InputStream input // 輸入流 ) { boolean isLogin = false; FTPClient ftp = new FTPClient(); try { int reply; 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(); return isLogin; } System.out.println("ftp鏈接成>>>>>>>>>>>>"); // FTPFile[] files = ftp.listFiles(); // for (FTPFile file : files) { // file.isFile(); // file.getName(); // file.getTimestamp(); // } //創建目錄,轉移工作目錄至指定目錄下 ftp = createDirs(path,ftp); // //轉移工作目錄至指定目錄下 // isLogin = ftp.changeWorkingDirectory(path); // log.info("pIsSuc:" + isLogin); // if (!isLogin) { // ftp.disconnect(); // return isLogin; // } isLogin = ftp.storeFile(filename, input); if (!isLogin) { System.out.println("ftp上傳文件失敗:" + isLogin+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); ftp.disconnect(); return isLogin; } isLogin = true; } catch (FileNotFoundException e) { //后面代碼省略。。。。
2.在applicationContext.xml中配置定時任務的時間,關鍵代碼如下:
<!-- 定時生成報表文件 --> <bean id="ftpUploadFileJobTask" class="com.quartz.FtpUploadFileJobTask"> <property name="testService"> <ref bean="testService"/> </property> </bean> <bean id="ftpUploadFileJobBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="ftpUploadFileJobTask" /> <property name="targetMethod" value="execute" /> </bean> <bean id="ftpUploadFileQuartTime" class="org.springframework.scheduling.quartz.CronTriggerBean" lazy-init="false" autowire="no"> <property name="jobDetail"> <ref bean="ftpUploadFileJobBean" /> </property> <!-- 0 1 0 1 * ?==0:秒,1:分,0:時,1:號,*:每個月,?星期幾 --> <property name="cronExpression" value="0 1 0 1 * ?" /> <!-- 每月的1號的00點01分執行--> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="ftpUploadFileQuartTime"/> </list> </property> </bean>
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。