1. 程式人生 > >java呼叫kettle向job(任務)和transformation(轉換)傳遞引數例項

java呼叫kettle向job(任務)和transformation(轉換)傳遞引數例項

      最近要對一個系統的資料同步到另一個系統中,要求新系統的資料結果完成之後,實時同步到另一個系統資料表中。
      也就是動態的傳一個關聯的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傳遞的引數一致,可以寫值進行測試。


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

否則就都需要資料庫支撐,資料庫方法呼叫了。