java呼叫kettle向job(任務)和transformation(轉換)傳遞引數例項
阿新 • • 發佈:2019-02-20
最近要對一個系統的資料同步到另一個系統中,要求新系統的資料結果完成之後,實時同步到另一個系統資料表中。
也就是動態的傳一個關聯的ID。由於舊系統是vb做的,無法提供webservice介面,並且同步的表涉及到十幾張表,並且兩個系統表結構完全不一樣,所以想到了kettle。
java整合kettle網上有現成的例項,很簡單。如:http://bakcom.iteye.com/blog/1399587
也就是動態的傳一個關聯的ID。由於舊系統是vb做的,無法提供webservice介面,並且同步的表涉及到十幾張表,並且兩個系統表結構完全不一樣,所以想到了kettle。
java整合kettle網上有現成的例項,很簡單。如:http://bakcom.iteye.com/blog/1399587
雖然網上文章有說java可以傳遞引數給kettle,不過只找到了傳遞引數給轉換的文章,沒有講引數傳遞給job,kettle中如何使用java傳遞的引數。今天就以上問題,一併共享。
/** * 本測試類慎用!!!!!!! * * @param args */ public static void main(String[] args) { String datetime = "2014-12-19 23:20:45"; String[] params = {"707", datetime}; // 傳遞引數 String path = "F:\\job7.kjb"; // runTransfer(params, path); runJob(params, path); // runJob(); // jbResource(); } /** * 執行轉換檔案方法 * @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]); 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(); } }
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">以上是片段。實現了呼叫任務和轉換的方法,我只給出了呼叫任務和轉換檔案的方法,連線資料庫的在此略過。</span>
下面就是如何使用java傳遞的引數了。
轉換的網上有例子,轉換工作臺,開啟輸入,找到“獲取系統資訊”
進行變數定義,選擇命令引數1。。。n即可
就可以引用我示例中的1,2引數了。
但是我們的遷移工作是要按順序執行的,呼叫轉換不夠用,需要job來定義執行順序,
比如上面的轉換作為第一步,操作完進行其他步驟,那麼在這個基礎上,可以畫一個job
這時候問題來了,我們要活得java的資料,同時這個job需要把引數傳遞給test2轉換使用。
其實很簡單,點開test2,切換到引數選型,將java定義的引數寫進去,記住帶{}
這樣就大功搞成了。java已經能夠順利的將值傳遞給job,job可以順利的將值傳遞給轉換。
點選run this job 在variable中定義引數名稱跟java傳遞的引數一致,可以寫值進行測試。
注意事項:任務和轉換要存成檔案格式,任務中引用的轉換也要是檔案格式,
否則就都需要資料庫支撐,資料庫方法呼叫了。