这次间隔时间比较长,这次记录一下怎么使用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},就可以取到传入的值了。