此次间隔时间比较长,此次记录一下怎么使用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的例子吧!如图:线程
首先,要建立一个转换,在输入中拖拽出获取系统信息,按照图片上面设置一下,而后在输出中拖拽出文本文件输出,如图:debug
配置好文件的输出位置和类型,而后配置字段,如图:3d
而后执行咱们的java程序,执行java程序可能须要不少jar包,这些jar包均可以在这里,如图:日志
而后执行咱们的程序,如图:xml
控制台打印出来的是kettle日志和我获取的result的xml输出,能够忽略了,结果只看INFO开头的就好了。对象
那么简单使用java调用kettle就完成了。
job在这里没有写,是由于job的传参数十分简单,只要使用:job.setVaribale("name","");//这段代码就能够传入参数到job中,在job中使用也特别简单。直接在须要使用的地方${name},就能够取到传入的值了。