项目背景
报表导出业务涉及了两个库,所以这就导致了要进行跨库进行查询,在原本的库设计层面,这两个库是完全物理隔绝的,是没办法进行跨表查询的,所以,我就想了个办法来进行数据的迁移,但是组内资金有限,又不可能在申请服务器,引发了我想用基本的 java 代码,写一个 job 定时任务来定时的调用 ktr 文件就可以了
实施过程
一、maven 本地安装 ktr 所需要的 jar 包
ktr 文件如果用编辑器打开的话,是可以看到就是 xml 的文件,所以,它只是个配置文件,其中需要用到好多 jar 包,那么我们需要下载哪些呢,这里我来详细的说明一下
- 我们在下载了 Kettle 整个项目的时候,我们可以看到它本地是有目录的,如下图所示,重点强调一下,这个 Kettle 是有 JDK 版本之分的,如果你用的是 1.7 的 JDK,你的服务器就要是 1.7 的 JDK,否则的话容易报数组越界,或者导出的数据会有乱码,简单一句话,你开发用的是 1.7 就用 1.7,你开发用的是 1.8 就用 1.8Kettle 下载地址
- 我们把这三个基本的 jar 包通过 maven 的命令导入到我们的本地 maven 库中,我得做法是把这三个包放到一个文件夹目录下面,这样好些命令,然后通过 IDEA 的 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
弄这点东西浪费一下午,不过成果还算可以,可以实现跨库的实现了,就是把另一个库的文件实时的迁移到了本地库中,很奈斯
作者:lovePaul77