溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Quartz石英調(diào)度實現(xiàn)ftp文件上傳

發(fā)布時間:2020-06-12 06:07:49 來源:網(wǎng)絡(luò) 閱讀:874 作者:101ttyy 欄目:開發(fā)技術(shù)

Quartz石英調(diào)度實現(xiàn)ftp文件上傳

實現(xiàn)一個每月1號00點01分自動生成的文件,通過ftp傳到另一臺主機上

1.先創(chuàng)建一個job任務(wù)類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;
    
    /**
         * 實現(xiàn)任務(wù)的方法
         */
    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作為數(shù)據(jù)分隔符
            byte[] b1 = {0x01};
            String b1Str = new String(b1);
            StringBuffer sb = new StringBuffer();
            String titleStr = "用戶ID"+b1Str+"訂單生成時間"+b1Str+"月份"+b1Str+"代理商編碼"+b1Str+"推薦工號"+"\r\n";
            sb.append(titleStr);
            //內(nèi)容追加省略。。。
            boolean connetFlag= getConnetFTP(ip, port, username, password, remotepath, fileName);
            if(connetFlag){
                //上傳數(shù)據(jù)文件
                uploadFile(remotepath, fileName, new ByteArrayInputStream((sb.toString()).getBytes("GBK")));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //關(guān)閉連接
            ftpLogOut();
        }
    }
    
    /**
     * ftp上傳文件
     * @param path
     * @param filename
     * @param input
     * @return
     */
    public boolean uploadFile(
            String path, // FTP服務(wù)器保存目錄
            String filename, // 上傳到FTP服務(wù)器上的文件名
            InputStream input // 輸入流
    ) {
        boolean isLogin = false;
        try {
            //創(chuàng)建目錄,轉(zhuǎn)移工作目錄至指定目錄下
            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服務(wù)器hostname
            int port,// FTP服務(wù)器端口
            String username, // FTP登錄賬號
            String password, // FTP登錄密碼
            String path, // FTP服務(wù)器保存目錄
            String filename // 上傳到FTP服務(wù)器上的文件名
    ) throws IOException{
        boolean isLogin = false;
        this.ftpClient = new FTPClient();
        int reply;
        if (port > 0) {
            this.ftpClient.connect(hostname, port);// 連接FTP服務(wù)器
        } else {
            this.ftpClient.connect(hostname);
        }
        // 如果采用默認端口,可以使用ftp.connect(ftp)的方式直接連接FTP服務(wù)器
        this.ftpClient.login(username, password);// 登錄
        // 檢驗是否連接成功
        reply = this.ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
                System.out.println("ftp鏈接失敗>>>");
            this.ftpClient.disconnect();
            return isLogin;
        }
        //使用二進制保存方式,沒有設(shè)置在linux系統(tǒng)下?lián)Q行“\r\n”不起作用
        this.ftpClient.setFileType(this.ftpClient.BINARY_FILE_TYPE);
        isLogin = true;
        return isLogin;
    }
    /**
     * @退出關(guān)閉服務(wù)器鏈接
     * */
    public void ftpLogOut() {
        if (null != this.ftpClient && this.ftpClient.isConnected()) {
            try {
                boolean reuslt = this.ftpClient.logout();// 退出FTP服務(wù)器
                if (reuslt) {
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(this.ftpClient.isConnected()){
                    try {
                        this.ftpClient.disconnect();// 關(guān)閉FTP服務(wù)器的連接
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    /**
     * 創(chuàng)建目錄
     * @param remoteUpLoadPath
     * @throws IOException
     */
    public void createDirs(String remoteUpLoadPath) throws IOException {
        String[]dirs = remoteUpLoadPath.split("/");
        //移動到linux系統(tǒng)的根目錄下,注:這段代碼在window系統(tǒng)上執(zhí)行代碼會報錯。
        this.ftpClient.changeWorkingDirectory("/");
        for(String dir : dirs){
            this.ftpClient.mkd(dir);
            this.ftpClient.changeWorkingDirectory(dir);
        }
    }
}


這里僅是通過ftp在目標主機上生產(chǎn)文件,并把數(shù)據(jù)直接寫入生成的文件中。

如果需要在項目主機上先生成文件在通過ftp傳到目標主機上,則可以通過以下代碼實現(xiàn):


先將數(shù)據(jù)寫入文件:

/**
     * 數(shù)據(jù)寫入到文件
     * @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();// 關(guān)閉輸出流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
/**
     * 創(chuàng)建文件路徑,并獲取文件名
     * @return
     */
    public String getCreateFile(String path,String fileName){
        File file = new File(path+fileName);
        if(!file.exists()){//文件不存在
            file.getParentFile().mkdirs();//創(chuàng)建文件目錄
        }
        return path+fileName;
    }

調(diào)用寫入數(shù)據(jù)方法

//context:數(shù)據(jù)內(nèi)容
this.writerFileDate(context, this.getCreateFile(localpath,fileName),false);

生成文件后,在通過ftp傳到目標主機,關(guān)鍵代碼如下:

     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服務(wù)器hostname
            int port,// FTP服務(wù)器端口
            String username, // FTP登錄賬號
            String password, // FTP登錄密碼
            String path, // FTP服務(wù)器保存目錄
            String filename, // 上傳到FTP服務(wù)器上的文件名
            InputStream input // 輸入流
    ) {
        boolean isLogin = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            if (port > 0) {
                ftp.connect(hostname, port);// 連接FTP服務(wù)器
            } else {
                ftp.connect(hostname);//默認端口可以這樣鏈接
            }
            // 如果采用默認端口,可以使用ftp.connect(ftp)的方式直接連接FTP服務(wù)器
            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();
//            }
            //創(chuàng)建目錄,轉(zhuǎn)移工作目錄至指定目錄下
            ftp = createDirs(path,ftp);
//            //轉(zhuǎn)移工作目錄至指定目錄下
//            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中配置定時任務(wù)的時間,關(guān)鍵代碼如下:

<!-- 定時生成報表文件 -->
   <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分執(zhí)行-->
    </bean>
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
            <ref bean="ftpUploadFileQuartTime"/>
            </list>
        </property>
    </bean>









向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI