Kettle
1.安装kettle
点击下载按钮,选择对应版本下载到本地解压,执行文件目录下的Spoon.bat。(注意,kettle需要对应版本的jdk环境)
kettle下载链接
2.制作转换
新建作业,在左侧输入中拖入表输入
编辑表输入,新建数据库连接,这里我的是mysql数据库(如果提示缺少驱动的话可以将数据库驱动放入kettle安装目录的lib下,再重启kettle);使用JNDI模式,为了方便区别开发环境和上线正式环境,通过JNDI名称在配置里对应jdbc连接(配置下一步会讲)。
最后通过编写sql,第一步的数据读取就完成了。
拖拽出在输出中的插入/ 更新,然后按住shift可以连接两个步骤。编辑插入/ 更新,和上一步一样配置数据库连接,然后指定主键和更新字段。此时一个简单的同步demo就完成了。
3.配置JNDI
打开kettle安装目录下的simple-jndi/jdbc.properties,按以下方式配置,其中scihi-lowcode对应的是转换中的JDNI名称,文件之中可以配置多个连接。
scihi-lowcode/type=javax.sql.DataSource
scihi-lowcode/driver=ccom.mysql.cj.jdbc.Driver
scihi-lowcode/url=jdbc:mysql://127.0.0.1:3306/scihi-lowcode?zeroDateTimeBehavior=convertToNull&characterEncoding=utf8&serverTimezone=GMT
scihi-lowcode/user=root
scihi-lowcode/password=root
最后我们运行测试成功
Java集成kettle
1.引入相关依赖
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>7.1.0.0-12</version>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
<version>7.1.0.0-12</version>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>metastore</artifactId>
<version>7.1.0.0-12</version>
</dependency>
<dependency>
<groupId>pentaho</groupId>
<artifactId>simple-jndi</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.2</version>
</dependency>
2.添加配置
这里我使用的yml配置路径的形式,方便上线正式环境
kettle:
# kettle jndi jdbc.properties文件地址
jndi-directory: D:\kettle\data-integration\simple-jndi
# kettle ktr执行文件地址
ktr-directory: D:\kettle\data
读取配置并在bean初始化的时候指定jndi路径
@Value(value = "${kettle.jndi-directory}")
public void setJndiDirectory(String jndiDirectory) {
KettleReadUtils.jndiDirectory = jndiDirectory;
}
private static String jndiDirectory;
@Value(value = "${kettle.ktr-directory}")
public void setKtrDirectory(String ktrDirectory) {
KettleReadUtils.ktrDirectory = ktrDirectory;
}
private static String ktrDirectory;
@PostConstruct
public void init(){
File file = new File(KettleReadUtils.jndiDirectory);// 这个path就是jdbc.prtoperties文件的配置路径,指向上层文件夹路径即可,建议是绝对路径。
String sysPath = null;
try {
sysPath = file.getCanonicalPath();
} catch (IOException e) {
log.error("Failed to obtain jndi path!");
}
Const.JNDI_DIRECTORY = sysPath;
log.info("kettle jndi successfully loaded");
}
3. java相关方法
执行ktr文件的方法
/**
* 调用 kettle ktr
*
* @param path 文件路径
*/
public static void runKtr(String path) {
try {
KettleEnvironment.init();
EnvUtil.environmentInit();
TransMeta transMeta = new TransMeta(ktrDirectory + File.separator+path);
Trans trans = new Trans(transMeta);
trans.execute(null);
trans.waitUntilFinished();
if (trans.getErrors() > 0) {
throw new Exception("Errors during transformation execution!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
最后执行java方法进行测试,测试成功!
以上就是java集成kettle并且使用jndi配置数据库连接的形式执行ktr的全步骤了。
4.补充:执行.kjb作业
kettle新建作业
引用转换时,建议通过相对路径去指定
${Internal.Entry.Current.Directory}/ktr/test.ktr
java中执行.kjb作业时使用该相对路径,需要引入jsch包
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>
<version>0.2.9</version>
</dependency>
java代码:
/**
* 调用 kettle job
*
* @param paraNames 多个参数名
* @param paraValues 多个参数值
* @param path 如: String fName= "\\kettle\\aaa.kjb";
*/
public static void runJob(String[] paraNames, String[] paraValues, String path) {
try {
KettleEnvironment.init();
JobMeta jobMeta = new JobMeta(ktrDirectory + File.separator + path, null);
Job job = new Job(null, jobMeta);
// 向Job 脚本传递参数,脚本中获取参数值:${参数名}
if (paraNames != null && paraValues != null) {
for (int i = 0; i < paraNames.length && i < paraValues.length; i++) {
job.setVariable(paraNames[i], paraValues[i]);
}
}
job.start();
job.waitUntilFinished();
if (job.getErrors() > 0) {
throw new Exception("Errors during job execution!");
}
} catch (Exception e) {
e.printStackTrace();
}
}