当前位置: 首页 > news >正文

SpringBoot下调用kettle脚本

一、pom引入kettle相关依赖

<properties><kettle.version>7.1.0.9-101</kettle.version>
</properties>
<!-- 核心包 -->
<dependency><groupId>pentaho-kettle</groupId><artifactId>kettle-core</artifactId><version>${kettle.version}</version>
</dependency>
<dependency><groupId>pentaho-kettle</groupId><artifactId>kettle-engine</artifactId><version>${kettle.version}</version>
</dependency>
<dependency><groupId>pentaho</groupId><artifactId>metastore</artifactId><version>${kettle.version}</version>
</dependency>
<!-- 其他依赖包,不同版本可能不同 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-vfs2</artifactId><version>2.1</version>
</dependency>

二、设置脚本参数

打开转换或者作业脚本,右键,选择“转换设置”或者“作业设置”,设置命名参数。参数可以在脚本中用${name}方式使用,包括数据库连接都可以用。在java程序调用时,可以传递参数给脚本,实现动态变化;
在这里插入图片描述

三、Java中调用脚本

import java.lang.reflect.Field;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
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;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** kettle 工具类* @author 锁战强**/public class KettleUtils {private static String KETTLE_FILE_PATH="";static {try {KettleEnvironment.init();//初始化kettle环境EnvUtil.environmentInit();//读取kettle.properties文件加入环境变量} catch (KettleException e) {throw new AppException(e, ErrorCode.KETTLE_INIT_FAIL);}}/** * 运行转换文件方法* @param ktrPath 转换文件的路径,后缀ktr* @param params 多个参数变量值*/public static void runTransfer(String ktrPath, Map<String,String> variables, String[] params) {Trans trans = null;try {TransMeta transMeta = new TransMeta(KETTLE_FILE_PATH + ktrPath);// 转换trans = new Trans(transMeta);if(variables != null) {for(Entry<String,String> entry : variables.entrySet()) {trans.setParameterValue(entry.getKey(), entry.getValue());}}// 执行转换trans.execute(params);// 等待转换执行结束trans.waitUntilFinished();// 抛出异常if (trans.getErrors() > 0) {throw new AppException(ErrorCode.KETTLE_RUN_JOB_ERROR);}} catch (Exception e) {throw new AppException(e,ErrorCode.KETTLE_RUN_JOB_ERROR);}		}/*** java 调用 kettle 的job* */public static void runJob(String jobPath,Map<String,String> variables, String[] params) {try {// jobname 是Job脚本的路径及名称JobMeta jobMeta = new JobMeta(KETTLE_FILE_PATH + jobPath, null);			// 向Job 脚本传递参数,脚本中获取参数值:${参数名}for(Entry<String,String> entry : variables.entrySet()) {jobMeta.setParameterValue(entry.getKey(), entry.getValue());}Job job = new Job(null, jobMeta);job.start();job.waitUntilFinished();if (job.getErrors() > 0) {throw new AppException(ErrorCode.KETTLE_RUN_JOB_ERROR);}} catch (Exception e) {throw new AppException(e,ErrorCode.KETTLE_RUN_JOB_ERROR);}}public static void main(String[] args) {String kettlePath = "f:/a.ktr";Map<String,String> map = new HashMap<>();map.put("db.host", "127.0.0.1");map.put("db.name", "compass");map.put("db.port", "1433");map.put("db.user", "sa");map.put("db.pwd", "******");    	KettleUtils.runTransfer(kettlePath, map, null);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux--数据链路层(macarp)
  • 实战演练:利用京东API一键抓取商品详情
  • SQL AI 工具:颠覆数据库管理与分析的创新力量
  • 如何在MySQL中禁止修改数据库表的特定列
  • 27. 聚合 DataFrame:探索数据的强大力量
  • 了解一下 CSS 的了解font-variant-alternates属性
  • 三防平板:定制化服务的趋势——以智慧医疗为例
  • 家用超声波清洗机哪个品牌好用?真正好用的超声波清洗机品牌
  • [线程]线程不安全问题 --- 死锁
  • 苹果 iOS / iPadOS 18 beta8和iOS / iPadOS 18.1 beta3版本更新
  • 设计模式 16 迭代器模式
  • 行得稳,跑得远,美团如何做到长期主义持续发力?
  • 电商行业如何解决“二清”问题
  • redis面试(二十六)总结
  • 【Java设计模式】上下文对象模式:简化上下文数据的访问
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Babel配置的不完全指南
  • classpath对获取配置文件的影响
  • co.js - 让异步代码同步化
  • iOS编译提示和导航提示
  • Tornado学习笔记(1)
  • 高度不固定时垂直居中
  • 关于extract.autodesk.io的一些说明
  • 基于游标的分页接口实现
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端性能优化--懒加载和预加载
  • 区块链技术特点之去中心化特性
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ​flutter 代码混淆
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #Linux(帮助手册)
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #每日一题合集#牛客JZ23-JZ33
  • #知识分享#笔记#学习方法
  • (1)虚拟机的安装与使用,linux系统安装
  • (2)Java 简介
  • (CPU/GPU)粒子继承贴图颜色发射
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Java)【深基9.例1】选举学生会
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (九)One-Wire总线-DS18B20
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (面试必看!)锁策略
  • (七)Java对象在Hibernate持久化层的状态
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十六)一篇文章学会Java的常用API
  • (实战篇)如何缓存数据