java調用kettle_實現(2)


(1).參照“java調用kettle_導入jar包(1)”,應用etl工具下lib里的所有jar

(2).

 

 

 

 

最近要對一個系統的數據同步到另一個系統中,要求新系統的數據結果完成之后,實時同步到另一個系統數據表中。
      也就是動態的傳一個關聯的ID。由於舊系統是vb做的,無法提供webservice接口,並且同步的表涉及到十幾張表,並且兩個系統表結構完全不一樣,所以想到了kettle。
      java集成kettle網上有現成的實例,很簡單。如:http://bakcom.iteye.com/blog/1399587

      雖然網上文章有說Java可以傳遞參數給kettle,不過只找到了傳遞參數給轉換的文章,沒有講參數傳遞給job,kettle中如何使用java傳遞的參數。今天就以上問題,一並共享。


import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.util.EnvUtil;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;

public class tests {

    /**
     * 本測試類慎用!!!!!!!
     *  
     * @param args
     */  
    public static void main(String[] args) {  
       String datetime = "2014-12-19 23:20:45";  
       String[] params = {"707", datetime}; // 傳遞參數   
       String path = "E:\\job.kjb";
       for (int i = 0; i < 3; i++) {
           params[0] += i;
           runJob(params, path);  
    }
    }  
 
    /**  
     * 運行轉換文件方法
     * @param params 多個參數變量值
     * @param ktrPath 轉換文件的路徑,后綴ktr
     */  
    public static void runTransfer(String[] params, String ktrPath) {  
        Trans trans = null;  
        try {  
            // // 初始化  
            // 轉換元對象  
            //KettleEnvironment.init();// 初始化  
            EnvUtil.environmentInit();  
            TransMeta transMeta = new TransMeta(ktrPath);  
            // 轉換  
            trans = new Trans(transMeta);  
              
            // 執行轉換  
            trans.execute(params);  
            // 等待轉換執行結束  
            trans.waitUntilFinished();  
            // 拋出異常  
            if (trans.getErrors() > 0) {  
                throw new Exception(  
                        "There are errors during transformation exception!(傳輸過程中發生異常)");  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
 
    /**
     * java 調用 kettle 的job
     *  
     * @param jobname
     *            如: String fName= "D:\\kettle\\informix_to_am_4.ktr";
     */  
    public static void runJob(String[] params, String jobPath) {  
        try {  
           KettleEnvironment.init();  
            // jobname 是Job腳本的路徑及名稱  
            JobMeta jobMeta = new JobMeta(jobPath, null);  
            Job job = new Job(null, jobMeta);  
            // 向Job 腳本傳遞參數,腳本中獲取參數值:${參數名}  
            // job.setVariable(paraname, paravalue);  
            job.setVariable("id", params[0]);  
            System.err.println(params[0]+"=========="+params[1]);
            job.setVariable("dt", params[1]);  
            job.start();  
            job.waitUntilFinished();  
            if (job.getErrors() > 0) {  
                throw new Exception(  
                        "There are errors during job exception!(執行job發生異常)");  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

}

下面就是如何使用java傳遞的參數了。

轉換的網上有例子,轉換工作台,打開輸入,找到“獲取系統信息”


進行變量定義,選擇命令參數1。。。n即可



就可以引用我示例中的1,2參數了。

但是我們的遷移工作是要按順序執行的,調用轉換不夠用,需要job來定義執行順序,

比如上面的轉換作為第一步,操作完進行其他步驟,那么在這個基礎上,可以畫一個job

 




這時候問題來了,我們要活得java的數據,同時這個job需要把參數傳遞給test2轉換使用。

其實很簡單,點開test2,切換到參數選型,將java定義的參數寫進去,記住帶{}


這里的參數指的是“位置參數

 

 

 

這樣就大功搞成了。java已經能夠順利的將值傳遞給job,job可以順利的將值傳遞給轉換。

點擊run this job 在variable中定義參數名稱跟java傳遞的參數一致,可以寫值進行測試


注意事項:任務和轉換要存成文件格式,任務中引用的轉換也要是文件格式,

否則就都需要數據庫支撐,數據庫方法調用了。

 

 

 

            來源:http://blog.csdn.net/dirful/article/details/42026545#comments


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM