使用kettle制作简单的同步转换示例并且在java项目中运行

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();
        }
    }
  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值