package com.woaiyitiaocai.util;

import java.util.Map;
import java.util.UUID; import org.apache.log4j.Logger;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.util.EnvUtil;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta; /**
* @功能描述: 执行kettle
* @项目版本: 1.0.0
* @相对路径: com.woaiyitiaocai.util.ExecKettleUtil.java
* @创建作者: woaiyitiaocai
* @问题反馈: zhup@woaiyitiaocai.com
* @创建日期: 2017年2月27日 下午3:36:10
*/
public class ExecKettleUtil {
private static Logger logger_info = Logger.getLogger("api-info");
private static Logger logger_error = Logger.getLogger("api-error"); /**
* @功能描述: 执行job
* @使用对象: woaiyitiaocai
* @创建作者: woaiyitiaocai
* @创建日期: 2017年2月27日 下午3:51:33
* @param initKettleParam job参数
* @param kjbFilePath job路径
* @return
*/
public static boolean runKettleJob(Map<String,String> initKettleParam, String kjbFilePath) {
String uuid = UUID.randomUUID().toString();
logger_info.info("ExecKettleUtil@runKettleJob:"+uuid+" {kjbFilePath:"+kjbFilePath+"}");
try {
KettleEnvironment.init();
//初始化job路径
JobMeta jobMeta = new JobMeta(kjbFilePath, null);
Job job = new Job(null, jobMeta);
//初始化job参数,脚本中获取参数值:${variableName}
for (String variableName : initKettleParam.keySet()) {
job.setVariable(variableName, initKettleParam.get(variableName));
}
job.start();
job.waitUntilFinished();
if (job.getErrors() > 0) {
logger_info.info("ExecKettleUtil@runKettleJob:"+uuid+" 执行失败");
}else{
logger_info.info("ExecKettleUtil@runKettleJob:"+uuid+" 执行成功");
}
return true;
} catch (Exception e) {
logger_error.error("ExecKettleUtil@runKettleJob:"+uuid, e);
return false;
}
} /**
* @功能描述: 执行Transfer
* @使用对象: woaiyitiaocai
* @创建作者: woaiyitiaocai
* @创建日期: 2017年2月27日 下午3:51:33
* @param initKettleParam Transfer参数
* @param ktrFilePath Transfer路径
* @return
*/
public static boolean runKettleTransfer(Map<String,String> initKettleParam, String ktrFilePath) {
Trans trans = null;
String uuid = UUID.randomUUID().toString();
logger_info.info("ExecKettleUtil@runKettleTransfer:"+uuid+" {ktrFilePath:"+ktrFilePath+"}");
try {
//初始化
KettleEnvironment.init();
EnvUtil.environmentInit();
TransMeta transMeta = new TransMeta(ktrFilePath);
//转换
trans = new Trans(transMeta);
//初始化trans参数,脚本中获取参数值:${variableName}
for (String variableName : initKettleParam.keySet()) {
trans.setVariable(variableName, initKettleParam.get(variableName));
}
//执行转换
trans.execute(null);
//等待转换执行结束
trans.waitUntilFinished();
if (trans.getErrors() > 0) {
logger_info.info("ExecKettleUtil@runKettleTransfer:"+uuid+" 执行失败");
}else{
logger_info.info("ExecKettleUtil@runKettleTransfer:"+uuid+" 执行成功");
}
return true;
} catch (Exception e) {
logger_error.error("ExecKettleUtil@runKettleTransfer:"+uuid, e);
return false;
}
} }

今天要做的项目中用到了在系统中执行kettle脚本,于是自己写了一个,java调用kettle的job和transfer工具类。相关的jar包从etl的开发工具中复制出来就ok了,也可以去官网上面下载。此示例是由程序中出发执行kettle程序,如果不需要由程序触发最简单的就是直接写到linux的定时器去执行了。那就不需要这个类了。
kettle在这里是做数据的抽取,清洗,用kettle开发更有效率,程序也更健壮。这里就不给出kettle的脚本了。java工具类代码如上面所示。
网上也有很多各种各样现成的示例,我的仅供参考,欢迎吐槽。

以下是相关maven依赖

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.scannotation</groupId>
<artifactId>scannotation</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>***</groupId>
<artifactId>kettle-vfs</artifactId>
<version>5.2.0.0</version>
<classifier>pentaho</classifier>
</dependency>
<dependency>
<groupId>***</groupId>
<artifactId>kettle-engine</artifactId>
<version>5.2.0.0</version>
</dependency>
<dependency>
<groupId>***</groupId>
<artifactId>kettle-core</artifactId>
<version>5.2.0.0</version>
</dependency>

  

java调用kettle的job和transfer工具类的更多相关文章

  1. JAVA调用操作javascript (JS)工具类

    import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import ...

  2. Java Class与反射相关的一些工具类

    package com.opslab.util; import org.apache.log4j.Logger; import java.io.File;import java.io.IOExcept ...

  3. Java语言Lang包下常用的工具类介绍_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都 ...

  4. 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore

    前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...

  5. Java并发(十三):并发工具类——同步屏障CyclicBarrier

    先做总结 1.CyclicBarrier 是什么? CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点) ...

  6. java关闭资源,自制关闭资源工具类

    在网上看到一篇关于关闭资源的正确方式:http://blog.csdn.net/bornforit/article/details/6896775 该博文中的总结: (1)使用finally块来关闭物 ...

  7. Java实现单词自定义排序|集合类、工具类排序、comparable、comparator接口

    课题 针对单词进行排序,先按字母的长度排序,长者在前: 在长度相等的情况下,按字典降序排序. 例如,有单词序列"apple banana grape orange",排序后输出结果 ...

  8. Java操作zip压缩和解压缩文件工具类

    需要用到ant.jar(这里使用的是ant-1.6.5.jar) import java.io.File; import java.io.FileInputStream; import java.io ...

  9. Java基础知识强化92:日期工具类的编写和测试案例

    1. DateUtil.java,代码如下: package cn.itcast_04; import java.text.ParseException; import java.text.Simpl ...

随机推荐

  1. Visual Studio 2012 和 SVN 结合实现版本控制 AnkhSvn

    第一步: 安装VisualSVN Server Manager. 下载地址:http://www.onlinedown.net/soft/89603.htm 第二步: 安装TortoiseSVN.注意 ...

  2. 谈谈在.NET Core中使用Redis和Memcached的序列化问题

    前言 在使用分布式缓存的时候,都不可避免的要做这样一步操作,将数据序列化后再存储到缓存中去. 序列化这一操作,或许是显式的,或许是隐式的,这个取决于使用的package是否有帮我们做这样一件事. 本文 ...

  3. 一篇文章看懂Java并发和线程安全

    一.前言 长久以来,一直想剖析一下Java线程安全的本质,但是苦于有些微观的点想不明白,便搁置了下来,前段时间慢慢想明白了,便把所有的点串联起来,趁着思路清晰,整理成这样一篇文章. 二.导读 1.为什 ...

  4. 【CF17E】Palisection(回文树)

    [CF17E]Palisection(回文树) 题面 洛谷 题解 题意: 求有重叠部分的回文子串对的数量 所谓正难则反 求出所有不重叠的即可 求出以一个位置结束的回文串的数量 和以一个位置为开始的回文 ...

  5. 【BZOJ1877】晨跑(费用流)

    [BZOJ1877]晨跑(费用流) 题面 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在 ...

  6. $CDQ$分治总结

    A.\(CDQ\) 分治 特别基础的教程略. \(CDQ\)分治的优缺点: ( 1 )优点:代码量少,常数极小,可以降低处理维数. ( 2 )缺点:必须离线处理. \(CDQ\)分治与其他分治最本质的 ...

  7. 【BZOJ1305】跳舞(网络流)

    [BZOJ1305]跳舞(网络流) 题面 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一 ...

  8. webapi下的web请求

    先看webapi提供的服务: [HttpPost] public ResultBaseModel SiteList(SiteModel param) { ResultBaseModel resultM ...

  9. 4.2 js没有块级作用域

    JavaScript没有块级作用域.在其他语言上,比如C语言中,有花括号封闭的代码块都有自己的作用域,(如果用ECMAScript的话来讲,就是他们自己的执行环境),因而支持根据条件来定义变量.例如, ...

  10. (python走过的坑)OpenCV中错误opencv-3.3.1\modules\highgui\src\window.cpp:339: error: (-215) size.width>0 && size.height>0 in function cv::imshow

    第一次在python中使用OpenCV(cv2),运行时报错opencv-3.3.1\modules\highgui\src\window.cpp:339: error: (-215) size.wi ...