最近要對一個系統的資料同步到另一個系統中,要求新系統的資料結果完成之後,即時同步到另一個系統資料表中。
也就是動態傳一個關聯的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傳遞的參數一致,可以寫值進行測試。
注意事項:任務和轉換要存成檔案格式,任務中引用的轉換也要是檔案格式,
否則就都需要資料庫支撐,資料庫方法調用了。