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},就能够取到传入的值了。

相关文章
相关标签/搜索