此次間隔時間比較長,此次記錄一下怎麼使用java來調用咱們書寫好的kettle腳本,由於我以前一直是使用建立文件的形式來保存kettle腳本,因此對於kettle來講使用java程序來講能夠對kettle腳本能夠隨意的調用的。那麼廢話很少說了,貼出示例代碼:java
package com.ice; import java.io.IOException; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.Result; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.job.Job; import org.pentaho.di.job.JobMeta; import org.pentaho.di.repository.Repository; import org.pentaho.di.repository.filerep.KettleFileRepository; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; /** * KettleUtil kettle工具類 用於執行Kettle腳本 * * @author ice * */ public class KettleUtil { /** * 執行本地job腳本 * * @param jobName * job腳本路徑以及文件名稱 * @param */ public static void callNativeJobWithParams(String jobName, String args[]) { try { // 初始化 KettleEnvironment.init(); Repository repository = new KettleFileRepository(); // jobName是job腳本的路徑以及名稱 JobMeta jobMeta = new JobMeta(jobName, repository); Job job = new Job(repository, jobMeta); // 向job腳本傳遞參數,腳本中獲取參數值:${參數名} // 若是須要從方法參數中添加並在此處添加 // job.setVariable("", ""); job.start(); // 等待job執行結束,而後程序才繼續執行 job.waitUntilFinished(); } catch (KettleException ke) { ke.printStackTrace(); } } /** * 調用本地轉換腳本(帶參數) * * @param transFileName * 轉換腳本路徑以及文件名 * @param param * 參數 */ public static void callNativeTransWithParam(String transFileName, String[] params) { try { // 初始化 KettleEnvironment.init(); // 轉換元對象 TransMeta transMeta = new TransMeta(transFileName); // 轉換對象 Trans trans = new Trans(transMeta); // 設置日誌等級(debug很是詳細,對於跟蹤問題有幫助) // trans.setLogLevel(LogLevel.DEBUG); // trans.setLogLevel(LogLevel.ROWLEVEL); // 傳遞參數 // 執行轉換準備執行 trans.prepareExecution(params); // 開啓線程並執行 trans.startThreads(); // 直接執行(須要傳入參數,若是使用該方法。能夠不是用prepareExecution。) // trans.execute(params); Result result = trans.getResult(); try { System.out.println(result.getXML()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // trans.execute(params); // 等待線程結束 trans.waitUntilFinished(); if (trans.getErrors() != 0) { System.out.println("執行轉換錯誤!"); } } catch (KettleException ke) { ke.printStackTrace(); } } }
這段相信若是用到的人,已經在網上找到一大堆了,只要按照這個例子進行一些修改就能夠了。ide
ps:其中這裏面須要說明的一點就是不管是java代碼執行轉換仍是執行job,都是能夠傳入參數(這個參數只能是string類型,好比想傳入日期、整數或者浮點等類型,這就須要向String類型轉)。工具
執行的代碼很簡單:spa
public static void main(String[] args) { KettleUtil .callNativeTransWithParam( "/home/ice/work/project/workspace_kettle/getVariablesFromProgram.ktr", new String[] { "test" }); }
下面作一個kettle的例子吧!如圖:線程
首先,要建立一個轉換,在輸入中拖拽出獲取系統信息,按照圖片上面設置一下,而後在輸出中拖拽出文本文件輸出,如圖:debug
配置好文件的輸出位置和類型,而後配置字段,如圖:3d
而後執行咱們的java程序,執行java程序可能須要不少jar包,這些jar包均可以在這裏,如圖:日誌
而後執行咱們的程序,如圖:xml
控制檯打印出來的是kettle日誌和我獲取的result的xml輸出,能夠忽略了,結果只看INFO開頭的就好了。對象
那麼簡單使用java調用kettle就完成了。
job在這裏沒有寫,是由於job的傳參數十分簡單,只要使用:job.setVaribale("name","");//這段代碼就能夠傳入參數到job中,在job中使用也特別簡單。直接在須要使用的地方${name},就能夠取到傳入的值了。