Kettle學習筆記(四)

   此次間隔時間比較長,此次記錄一下怎麼使用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的例子吧!如圖:線程

wKioL1LIzzCRpGrRAAI0a6SlhVU066.jpg

首先,要建立一個轉換,在輸入中拖拽出獲取系統信息,按照圖片上面設置一下,而後在輸出中拖拽出文本文件輸出,如圖:debug

wKioL1LIz4mBFksTAAIuTXRreE8371.jpg

配置好文件的輸出位置和類型,而後配置字段,如圖:3d

wKiom1LI0AySa3EuAAHo2rfakhU468.jpg

而後執行咱們的java程序,執行java程序可能須要不少jar包,這些jar包均可以在這裏,如圖:日誌

wKiom1LI0J_DU5DjAALtgElLapY132.jpg

而後執行咱們的程序,如圖:xml

wKioL1LI0NvTGDr2AALjxqS09x4944.jpg

控制檯打印出來的是kettle日誌和我獲取的result的xml輸出,能夠忽略了,結果只看INFO開頭的就好了。對象

那麼簡單使用java調用kettle就完成了。


job在這裏沒有寫,是由於job的傳參數十分簡單,只要使用:job.setVaribale("name","");//這段代碼就能夠傳入參數到job中,在job中使用也特別簡單。直接在須要使用的地方${name},就能夠取到傳入的值了。

相關文章
相關標籤/搜索