所需的jar包,目前我掌握的程度只用这几个就OK了.

第一种  直接调用本地ktr,把结果返回成JSON , 但只支持写死的SQL.(因为JsonOutput控件获取字段的原因.)

public class Test {public static void main(String[] args) throws KettleException {// ktr路径String filename = "C:/Users/OJ's big hole/Desktop/test.ktr";// 初始化kettle环境KettleEnvironment.init();// new tran的源数据对象TransMeta transMeta = new TransMeta(filename);// 创建tran对象Trans trans = new Trans(transMeta);     // 异常处理trans.prepareExecution(null);// 开始执行trans.startThreads();// 记录最后一个步骤的数据final List<RowMetaAndData> rows = new ArrayList<RowMetaAndData>();RowListener rowListner = new RowListener() {public void rowWrittenEvent(RowMetaInterface rowMeta, Object[] row)throws KettleStepException {rows.add(new RowMetaAndData(rowMeta, row));}public void rowReadEvent(RowMetaInterface arg0, Object[] arg1)throws KettleStepException {}public void errorRowWrittenEvent(RowMetaInterface arg0,Object[] arg1) throws KettleStepException {}};List<StepMetaDataCombi> steps = trans.getSteps();String stepname = steps.get(steps.size() - 1).stepname;StepInterface stepInterface = trans.findRunThread(stepname);stepInterface.addRowListener(rowListner);// 等待执行完毕trans.waitUntilFinished();String json = null;RowMetaAndData rmad = rows.get(rows.size()-1);json = "["+rmad.getString("json", null)+"]";// 打印JSON串System.out.println(json);if (trans.getErrors() > 0) {System.out.println("transformation error");} else {System.out.println("transformation successfully");}}
}

test.ktr

执行结果

测试JAVA代码,成功返回JSON

第二种  封装成工具类 传SQL参数 返回JSON(有两种方法,第二种方法性能更好)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.RowMetaAndData;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleStepException;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.RowListener;
import org.pentaho.di.trans.step.StepInterface;
import org.pentaho.di.trans.step.StepMetaDataCombi;/*** 登陆资源库,获取模型,运行* * @author* */
public class CallKtrUtil {public static List<Map<String, String>> getJsonDataByKettle(String sql)throws KettleException {long startTime = System.currentTimeMillis();// 转换文件地址String filename = "C:/Users/OJ's big hole/Desktop/returnJson.ktr";// 初始化kettle环境KettleEnvironment.init();// new tran的源数据对象TransMeta transMeta = new TransMeta(filename);// 创建tran对象Trans trans = new Trans(transMeta);// 传参数trans.setVariable("sql", sql);// 异常处理trans.prepareExecution(null);// 执行ktrtrans.execute(null);// 记录最后一个步骤的数据final List<RowMetaAndData> rows = new ArrayList<RowMetaAndData>();RowListener rowListner = new RowListener() {public void rowWrittenEvent(RowMetaInterface rowMeta, Object[] row)throws KettleStepException {rows.add(new RowMetaAndData(rowMeta, row));}public void rowReadEvent(RowMetaInterface arg0, Object[] arg1)throws KettleStepException {}public void errorRowWrittenEvent(RowMetaInterface arg0,Object[] arg1) throws KettleStepException {}};List<StepMetaDataCombi> steps = trans.getSteps();String stepname = steps.get(steps.size() - 1).stepname;StepInterface stepInterface = trans.findRunThread(stepname);stepInterface.addRowListener(rowListner);// 等待执行完毕trans.waitUntilFinished();List<Map<String, String>> lists = new ArrayList<Map<String, String>>();for (int i = 0; i < rows.size(); i++) {RowMetaAndData rmad = rows.get(i);String[] fields = rmad.getRowMeta().getFieldNames();Map<String, String> map = new HashMap<String, String>();for (String field : fields) {map.put(field, rmad.getString(field, null));}lists.add(map);}if (trans.getErrors() > 0) {System.out.println("transformation error");} else {System.out.println("transformation successfully");}long endTime = System.currentTimeMillis();System.out.println("运行时间:" + (endTime - startTime) + "ms");return lists;}public static String getJsonDataByKettle2(String sql)throws KettleException {long startTime = System.currentTimeMillis();// 转换文件地址String filename = "C:/Users/OJ's big hole/Desktop/jsonTest.ktr";// 初始化kettle环境KettleEnvironment.init();// new tran的源数据对象TransMeta transMeta = new TransMeta(filename);// 创建tran对象Trans trans = new Trans(transMeta);// 传参数trans.setVariable("selectSQL", sql);// 异常处理trans.prepareExecution(null);// 开始执行trans.startThreads();// 记录最后一个步骤的数据final List<RowMetaAndData> rows = new ArrayList<RowMetaAndData>();RowListener rowListner = new RowListener() {public void rowWrittenEvent(RowMetaInterface rowMeta, Object[] row)throws KettleStepException {rows.add(new RowMetaAndData(rowMeta, row));}public void rowReadEvent(RowMetaInterface arg0, Object[] arg1)throws KettleStepException {}public void errorRowWrittenEvent(RowMetaInterface arg0,Object[] arg1) throws KettleStepException {}};List<StepMetaDataCombi> steps = trans.getSteps();String stepname = steps.get(steps.size() - 1).stepname;StepInterface stepInterface = trans.findRunThread(stepname);stepInterface.addRowListener(rowListner);// 等待执行完毕trans.waitUntilFinished();String json = null;RowMetaAndData rmad = rows.get(rows.size()-1);json = "["+rmad.getString("json", null)+"]";if (trans.getErrors() > 0) {System.out.println("transformation error");} else {System.out.println("transformation successfully");}long endTime = System.currentTimeMillis();System.out.println("运行时间:" + (endTime - startTime) + "ms");return json;}
}

returnJson.ktr

jsonTest.ktr

测试结果

创建数据库资源库 调用ktr

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.RowMetaAndData;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleStepException;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.RepositoryDirectoryInterface;
import org.pentaho.di.repository.kdr.KettleDatabaseRepository;
import org.pentaho.di.repository.kdr.KettleDatabaseRepositoryMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.RowListener;
import org.pentaho.di.trans.step.StepInterface;
import org.pentaho.di.trans.step.StepMetaDataCombi;/*** 登陆资源库,获取模型,运行* * @author* */
public class CallKtr {private static Repository repository;private static Trans trans;private static DBRepositoryInfo rposInfo;/*** 数据库资源库初始化*/static {rposInfo = new DBRepositoryInfo();rposInfo.setDbHostname("*****");//如果是Oracle数据库  此处填写SID  而不是数据库名称 比如此处填/orclrposInfo.setDbName("****");rposInfo.setDbPort("****");rposInfo.setDbType("****");rposInfo.setDbUsername("****");rposInfo.setDbPassword("****");rposInfo.setRepoId("****");rposInfo.setRepoName("****");//默认都是adminrposInfo.setRepoPassword("admin");rposInfo.setRepoUsername("admin");new CallKtr(rposInfo);}/*** 资源库信息 初始化对象,初始化kettle环境和资源库*/public CallKtr(DBRepositoryInfo rposInfo) {try {// 初始化KettleEnvironment.init();this.initRepository(rposInfo);} catch (KettleException e) {e.printStackTrace();}}/*** 初始化资源库** @param rposInfo* @throws KettleException*/public void initRepository(DBRepositoryInfo rposInfo)throws KettleException {// 新建数据库资源库repository = new KettleDatabaseRepository();// 建立数据库连接DatabaseMeta databaseMeta = new DatabaseMeta(rposInfo.getDbName(),rposInfo.getDbType(), "Native", rposInfo.getDbHostname(),rposInfo.getDbName(), rposInfo.getDbPort(),rposInfo.getDbUsername(), rposInfo.getDbPassword());// 建立资源库信息KettleDatabaseRepositoryMeta kettleDatabaseMeta = new KettleDatabaseRepositoryMeta(rposInfo.getRepoId(), rposInfo.getRepoName(),"Transformation description", databaseMeta);// 初始化资源库repository.init(kettleDatabaseMeta);// 连接资源库repository.connect(rposInfo.getRepoUsername(),rposInfo.getRepoPassword());}//这个方法可以更换为上面提到过的第二种方法public static List<Map<String, String>> getJsonDataByKettle(String sql) throws KettleException {// 根据变量查找到模型所在的目录对象RepositoryDirectoryInterface directory = repository.findDirectory("/");// 创建ktr元对象TransMeta transformationMeta = ((Repository) repository).loadTransformation("returnJson", directory, null, true, null);trans = new Trans(transformationMeta);trans.setVariable("sql", sql);// 异常处理trans.prepareExecution(null);// 执行ktrtrans.execute(null);// 记录最后一个步骤的数据final List<RowMetaAndData> rows = new ArrayList<RowMetaAndData>();RowListener rowListner = new RowListener() {public void rowWrittenEvent(RowMetaInterface rowMeta, Object[] row)throws KettleStepException {rows.add(new RowMetaAndData(rowMeta, row));}public void rowReadEvent(RowMetaInterface arg0, Object[] arg1)throws KettleStepException {}public void errorRowWrittenEvent(RowMetaInterface arg0,Object[] arg1) throws KettleStepException {}};List<StepMetaDataCombi> steps = trans.getSteps();String stepname = steps.get(steps.size() - 1).stepname;StepInterface stepInterface = trans.findRunThread(stepname);stepInterface.addRowListener(rowListner);// 等待执行完毕trans.waitUntilFinished();List<Map<String,String>> lists=new ArrayList<Map<String,String>>();for (int i = 0; i < rows.size(); i++) {RowMetaAndData rmad = rows.get(i);String[] fields=rmad.getRowMeta().getFieldNames();Map<String,String> map =new HashMap<String,String>();for (String field : fields) {map.put(field, rmad.getString(field, null));}lists.add(map);}System.out.println(lists);if (trans.getErrors() > 0) {System.out.println("transformation error");} else {System.out.println("transformation successfully");}return lists;}
}

资源库javaBean

public class DBRepositoryInfo {private String dbName;private String dbType;private String dbHostname;private String dbPort;private String dbUsername;private String dbPassword;private String repoId;private String repoName;private String repoUsername;private String repoPassword;//get set方法...
}

java调用Kettle返回JSON结果相关推荐

  1. java调用kettle批量执行

    java调用kettle批量执行 之前只做了一个java调用单一ktr的例子,在用web程序控制ETL数据抽取过程的时候,难免会遇到要执行一个复选框列表的ktr,那么前段传过来的就不仅仅是一个ktr: ...

  2. java 调用kettle job 传参_java调用kettle向job(任务)和transformation(转换)传递参数实例...

    虽然网上文章有说java可以传递参数给kettle,不过只找到了传递参数给转换的文章,没有讲参数传递给job,kettle中如何使用java传递的参数.今天就以上问题,一并共享. /** * 本测试类 ...

  3. java调用kettle自定义kettle.properties配置文件路径

    java调用kettle自定义kettle.properties配置文件路径 默认路径 java调用kettle的jar包时,在初始化环境的时候,会在指定路径创建并加载kettle的kettle.pr ...

  4. ajax上传图片java6,java ajax上传图片返回json数

    java ajax上传图片返回json数 [2021-02-10 00:12:56]  简介: 解决java的ajax提交返回值中文乱码的方法:1.在RequestMapping的并发配置中加代码[p ...

  5. WebForm使用HttpWebRequest 调用webservice返回json

    WebForm使用HttpWebRequest 调用webservice返回json 调用webservice部分:返回的是json 调用webservice部分:返回的是json public st ...

  6. java调用kettle例子_Kettle API - Java调用示例

    Kettle API - Java调用示例 对向前兼容性的推荐:如果想要动态地创造Transformation (例如:从元数据),使用XML文件方法(KTR)而不是使用API.XML文件兼容Kett ...

  7. Java调用存储过程返回数组

    Java调用存储过程: 结合SQL操作与存储过程 create procedure set_death_age(poet VARCHAR2, poet_age NUMBER) poet_id NUMB ...

  8. java调用c 返回值_推荐--Linux平台下Java调用C函数(补充关于String类型函数返回值)...

    平台介绍 系统:ubuntu10.04 jdk:Java(TM) SE Runtime Environment (build 1.6.0_20-b02) gcc:gcc version 4.4.3 ( ...

  9. Java调用Kettle的作业和转换

    文章目录 一.准备工作 二.使用步骤 1.引入Jar包 2.创建工具类 三.可能出现的问题 总结 一.准备工作 1.jdk必须是1.8以上. 2.创建好的Kettle的作业和转换文件 二.使用步骤 1 ...

最新文章

  1. python批量识别图中文字自动命名_python实现批量命名照片
  2. [windows phone 7 ]查看已安装程序GUID
  3. 面试官:连Spring三级缓存都答不好,自己走还是我送你?
  4. 需求说明 用户登陆功能的实现 c#
  5. 如何将Anaconda更新到想要的python版本(其实使用的是Anaconda中的切换不同环境的方法,不过步骤挺好)
  6. netty : websocketx.WebSocketHandshakeException: not a WebSocket handshake request: missing upgrade
  7. c# npoi 公式不计算_玉米扣量因素:水分、杂质、不完善粒、生霉粒,检测方法及计算公式...
  8. BAT大揭秘:在腾讯、百度、阿里上班,差别竟然这么大?
  9. 2021最新电视盒子TV源码开源电视影视APP影视源码
  10. 手机通讯录html模板,手机通讯录导模板
  11. 重装/重置系统后,针对于虚拟机需要输入许可证,仍无法打不开问题
  12. Tomcat多虚拟主机实现
  13. catia曲面扫掠命令详解_4.3.3.15-扫掠曲面之二次曲线_两条引导线扫略
  14. 对接阿里云短信服务(附视频教程)
  15. 编写程序,找出用户输入的一串数的最大数,程序需要提示用户一个一个地输入数,当用户输入0或负数时,程序显示出已输入的最大负整数:
  16. egret新手引导反向遮罩
  17. .dll文件(DLL文件)
  18. 好看的悬疑电影,最好是高智商的
  19. 阿里云开发——Node JS模拟钢琴的开发与部署
  20. MySQL查看数据库表中的重复记录并删除

热门文章

  1. 计算机东北大学考研,东北大学计算机考研经验分享
  2. tcgames使用有延迟_用tcgames在电脑玩玩刺激战场、全军出击等游戏常见问题解决方案...
  3. 告别“僵尸粉”,微信教你清理无用关注
  4. 游侠原创:关于发展360企业级安全产品的一点看法
  5. http 中的post和get方法
  6. 为什么买入不了创业版_为什么股票账户买不了创业板?
  7. 数据结构课设-小老鼠走迷宫(JAVA版)
  8. mysql增删改查笔记
  9. 矩阵股份上市破发:年营收8.86亿募资10亿 公司市值37亿
  10. 大学生怎么高效的免费搜题?怎么获取题库API接口快速开发自己的搜题产品?