转载

服务器中java项目(springboot)调用Kettle转换脚本ktr

项目背景

报表导出业务涉及了两个库,所以这就导致了要进行跨库进行查询,在原本的库设计层面,这两个库是完全物理隔绝的,是没办法进行跨表查询的,所以,我就想了个办法来进行数据的迁移,但是组内资金有限,又不可能在申请服务器,引发了我想用基本的java代码,写一个job定时任务来定时的调用ktr文件就可以了

实施过程

一、maven本地安装ktr所需要的jar包

ktr文件如果用编辑器打开的话,是可以看到就是xml的文件,所以,它只是个配置文件,其中需要用到好多jar包,那么我们需要下载哪些呢,这里我来详细的说明一下

  1. 我们在下载了Kettle整个项目的时候,我们可以看到它本地是有目录的,如下图所示,重点强调一下,这个Kettle是有JDK版本之分的,如果你用的是1.7的JDK,你的服务器就要是1.7的JDK,否则的话容易报数组越界,或者导出的数据会有乱码,简单一句话,你开发用的是1.7就用1.7,你开发用的是1.8就用1.8
    Kettle下载地址
    Kettle下载地址
    解压之后进入文件目录中,可以看到这个lib的文件,里面就是我们需要的jar包
    这是我们需要的三个基本的jar包
    我们把这三个基本的jar包通过maven的命令导入到我们的本地maven库中,我得做法是把这三个包放到一个文件夹目录下面,这样好些命令,然后通过IDEA的maven导入到本地
    这就是通过IDEA中的maven导入jar包到本地maven库的方法
    导入的命令如下

mvn install:install-file -Dfile=D:\1\kettle-core-8.2.0.0-342.jar -DgroupId=pentaho-kettle -DartifactId=kettle-core -Dversion=8.2.0.0-342 -Dpackaging=jar

mvn install:install-file -Dfile=D:\1\kettle-engine-8.2.0.0-342.jar -DgroupId=pentaho-kettle -DartifactId=kettle-engine -Dversion=8.2.0.0-342 -Dpackaging=jar

mvn install:install-file -Dfile=D:\1\metastore-8.2.0.0-342.jar -DgroupId=pentaho-kettle -DartifactId=metastore -Dversion=8.2.0.0-342 -Dpackaging=jar

我是把这三个包复制到了本地的D盘中的文件夹1当中,如果你想直接用这个命令,就直接按照我的目录格式来,就可以了

二、编写好ktr文件,确保本地是可以跑通的在说

将编辑好的ktr文件放到本地当中,写一个测试单元来测试这个代码,并且,如果你是跨库的,用到了mysql和Oracle,那么必须要把这两个驱动jar包安装到本地,并被引用
引用这三个mavne的地址,在pom文件中引用这三个jar包,

        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-core</artifactId>
            <version>8.2.0.0-342</version>
        </dependency>
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>kettle-engine</artifactId>
            <version>8.2.0.0-342</version>
        </dependency>
        <dependency>
            <groupId>pentaho-kettle</groupId>
            <artifactId>metastore</artifactId>
            <version>8.2.0.0-342</version>
        </dependency>

然后写一个单元测试,代码如下

    @Test
    public void test_path() {
//        可以把文件放到resources目录下面,然后用hutool读取这文件
//        File file = FileUtil.file("33.ktr");
//        这是我本地进行测试的,所以我把文件放到了桌面上了,写了根目录
        File file = FileUtil.file("C:\\Users\\Y\\Desktop\\33.ktr");
        String path = file.getPath();
        System.out.println(path);
//        初始化
        KettleEnvironment.init();
//        加载文件
        TransMeta transMeta = new TransMeta(path);
        Trans trans = new Trans(transMeta);
//        放入参数,这里其实可以从数据库中取到
//        如果没有参数,可以把这步忽略
        trans.setParameterValue("stade", "2019-04-24");
        trans.prepareExecution(null);
        trans.startThreads();
//        等待执行完毕
        trans.waitUntilFinished();
    }

这段代码引用了哪些jar包呢,如下

import cn.hutool.core.io.FileUtil;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.MapDifference;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;

这些当你复制到文件的时候可能并不知道到底在maven中怎么引入这些jar包
复制下面的代码到pom文件就可以了

     <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-vfs2</artifactId>
            <version>2.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>27.1-jre</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        
      <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.5.6</version>
        </dependency>

只有把这些jar包都引全了,跑的测试单元代码就不会报错了

End

弄这点东西浪费一下午,不过成果还算可以,可以实现跨库的实现了,就是把另一个库的文件实时的迁移到了本地库中,很奈斯

正文到此结束
本文目录