这次间隔时间比较长,这次记录一下怎么使用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的例子吧!如图:

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

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

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

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

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

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

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