Kettle学习笔记(四)

   这次间隔时间比较长,这次记录一下怎么使用java来调用我们书写好的kettle脚本,因为我之前一直是使用创建文件的形式来保存kettle脚本,所以对于kettle来说使用java程序来说可以对kettle脚本可以随意的调用的。那么废话不多说了,贴出示例代码:

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();
        }
    }
}

   这段相信如果用到的人,已经在网上找到一大堆了,只要按照这个例子进行一些修改就可以了。

   ps:其中这里面需要说明的一点就是无论是java代码执行转换还是执行job,都是可以传入参数(这个参数只能是string类型,比如想传入日期、整数或者浮点等类型,这就需要向String类型转)。

执行的代码很简单:

public static void main(String[] args) {
    KettleUtil
            .callNativeTransWithParam(
                    "/home/ice/work/project/workspace_kettle/getVariablesFromProgram.ktr",
                    new String[] { "test" });
}

下面做一个kettle的例子吧!如图:

wKioL1LIzzCRpGrRAAI0a6SlhVU066.jpg

首先,要创建一个转换,在输入中拖拽出获取系统信息,按照图片上面设置一下,然后在输出中拖拽出文本文件输出,如图:

wKioL1LIz4mBFksTAAIuTXRreE8371.jpg

配置好文件的输出位置和类型,然后配置字段,如图:

wKiom1LI0AySa3EuAAHo2rfakhU468.jpg

然后执行我们的java程序,执行java程序可能需要很多jar包,这些jar包都可以在这里,如图:

wKiom1LI0J_DU5DjAALtgElLapY132.jpg

然后执行我们的程序,如图:

wKioL1LI0NvTGDr2AALjxqS09x4944.jpg

控制台打印出来的是kettle日志和我获取的result的xml输出,可以忽略了,结果只看INFO开头的就行了。

那么简单使用java调用kettle就完成了。


job在这里没有写,是因为job的传参数十分简单,只要使用:job.setVaribale("name","");//这段代码就可以传入参数到job中,在job中使用也特别简单。直接在需要使用的地方${name},就可以取到传入的值了。

你可能感兴趣的:(java调用kettle,kettle传参)