(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