目录
一、kjb和ktr文件创建
kjb文件
首先先新建一个Job,如下图所示,这样就新建了一个kjb文件,即一个可以被java运行的job。
ktr文件
然后创建一个ktr文件,即如下图所示
关于其中的元素,不过多的介绍了。
关联kjb和ktr
接着将kjb文件和ktr关联起来,如下图所示,右击,然后编辑作业入口,
在浏览处选择对应的ktr文件,
如果要查看 转换对应的ktr文件,直接双击转换这个节点就行。
变量信息
在kjb文件的空白处双击,出现如下图界面,这是用来设置全局变量的。
在ktr文件处也可以双击,设置ktr的文件变量,
这些变量可以设置默认值,也可以通过Java代码调用时传递进来。
如果要获取到变量,如下图所示的节点,${auth_code}是获取变量值。
在表输入中就可以使用上面获取的变量来作为入参,如下图所示。
OK,基本的元素就不介绍了,介绍变量是因为Java代码中需要使用,重点还是Java代码如何调用kjb文件。
二、 Java代码调用kjb
引包
肯定是要引入kettle的jar包的,kettle的包就是放在本地,而不是从maven仓库中获取的,
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>9.0.0.0-423</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\kettle-core-9.0.0.0-423.jar</systemPath>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
<version>9.0.0.0-423</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\kettle-engine-9.0.0.0-423.jar</systemPath>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>matastore</artifactId>
<version>9.0.0.0-423</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\metastore-9.0.0.0-423.jar</systemPath>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.2</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\commons-vfs2-2.2.jar</systemPath>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\jsch-0.1.54.jar</systemPath>
</dependency>
本项目搭建的是一个spring boot的工程,所以spring boot的所需jar包也要,还有数据库连接的包,完整的pom.xml文件如下面所示,
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fable.jsst</groupId>
<artifactId>kettle-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>kettle-server</name>
<description>kettle-server</description>
<properties>
<java.version>1.8</java.version>
<start-class>com.fable.jsst.kettleserver.KettleServerApplication</start-class>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>9.0.0.0-423</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\kettle-core-9.0.0.0-423.jar</systemPath>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
<version>9.0.0.0-423</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\kettle-engine-9.0.0.0-423.jar</systemPath>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>matastore</artifactId>
<version>9.0.0.0-423</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\metastore-9.0.0.0-423.jar</systemPath>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.2</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\commons-vfs2-2.2.jar</systemPath>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\jsch-0.1.54.jar</systemPath>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.2.0</version>
<scope>system</scope>
<systemPath>${project.basedir}\src\main\resources\libs\ojdbc14-10.2.0.2.0.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>17.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>net.sf.scannotation</groupId>
<artifactId>scannotation</artifactId>
<version>1.0.2</version>
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.12.Final</version>
<scope>compile</scope>
</dependency>
<!--<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<version>1.2</version>
<scope>compile</scope>
</dependency>-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.3.Final</version>
</dependency>
<dependency>
<groupId>com.slyak</groupId>
<artifactId>spring-data-jpa-extra</artifactId>
<version>3.0.0.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<!--包含本地jar包-->
<includeSystemScope>true</includeSystemScope>
<mainClass>${start-class}</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
放入kjb和ktr文件
此处是为了能让代码找到对应路径,其实也可以在项目配置下路劲即可。
如下图所示,这是我配置的本地调试路径,当然也可以设置为Linux的路径。
文件的话是保存在此处的,
项目部署在Linux上,所以Linux上是如此配置的
application-prod.prpperties
这个application-prod.properties是下面代码调用出的spring boot工程,即kettle-server工程
而组件等是安装在kettle目录下,即kettle工具的linux版,同样kjb和ktr文件也放在此处。
三、代码调用
定时任务
/**
* 任务:合表
*/
@Scheduled(cron = "0 0/30 * * * ?")
public void collectJobTask() {
log.info("定时任务合表开始。。。");
kettleService.startCollectJob();
log.info("定时任务合表结束。。。");
}
一个定时任务的代码,调用service,进行具体的逻辑。
service中有两步,第一步获取参数,刚才在kjb和ktr中设置的参数需要修改,第二就是运行job
/**
* 合表
*/
@Override
public void startCollectJob() {
Map<String, String> params = setCollectParam();
log.info("开始执行【合表】任务...");
long startTime = System.currentTimeMillis();
//todo job 地址需修改
runJob(params, env.getProperty("kettle.collect.job.path"));
long endTime = System.currentTimeMillis();
log.info("【合表】任务结束,耗时{}s", (endTime - startTime) / 1000);
}
第一步获取参数是setCollectParam方法,此方法如下,获取application.properties中配置的数据,放入map中即可。
Map<String, String> params = new HashMap<>();
// 从配置文件读取源(省、市、区)、目标配置
//省
params.put("jlk_ip", env.getProperty("kettle.jlk.ip"));
params.put("jlk_db", env.getProperty("kettle.jlk.db"));
params.put("jlk_port", env.getProperty("kettle.jlk.port"));
params.put("jlk_pwd", env.getProperty("kettle.jlk.pwd"));
params.put("jlk_username", env.getProperty("kettle.jlk.username"));
env是spring的一个类org.springframework.core.env.Environment
第二步是runJob方法,下面的kettle.collect.job.path就是配置在application.prpoerties中的kjb路径,现在就获取了。
kettle.collect.job.path
runJob(params, env.getProperty("kettle.collect.job.path"));
下面这个就是运行的job的方法了,
/**
* 运行作业文件
*
* @param params 作业参数
* @param kjbPath 作业文件路径,后缀kjb
*/
private void runJob(Map<String, String> params, String kjbPath) {
try {
StepPluginType.getInstance().getPluginFolders().add(new PluginFolder(env.getProperty("kettle.utils.plugins.path"), false, true));
KettleEnvironment.init();
JobMeta jobMeta = new JobMeta(kjbPath, null);
// 配置作业参数
for (String param : params.keySet()) {
jobMeta.setParameterValue(param, params.get(param));
}
Job job = new Job(null, jobMeta);
// 设置日志级别
job.setLogLevel(LogLevel.ERROR);
log.info("启动作业...");
job.start();
log.info("等待作业执行完毕...");
job.waitUntilFinished();
if (job.getErrors() > 0) {
log.info("作业执行出错!");
throw new Exception("作业执行出错");
}
} catch (Exception e) {
log.info("作业执行异常!", e);
}
}
初始化插件
StepPluginType.getInstance().getPluginFolders().add(new PluginFolder(env.getProperty("kettle.utils.plugins.path"), false, true));
插件就是下图工具中的东西,本地调试可以这么搞,如果是部署在Linux上,那么就要配置安装在linux上的工具插件位置。
kettle环境初始化,
KettleEnvironment.init();
此时此处可以放在Application类中,即运行spring boot时就初始化,没必要每次schedule就初始化一次,费时间。
即下面这样。
@SpringBootApplication
@EnableScheduling
@ComponentScan(basePackages = "com.fable")
public class KettleServerApplication {
public static void main(String[] args) {
KettleEnvironment.init();
SpringApplication.run(KettleServerApplication.class, args);
}
}
将kjb加载到job元数据类中。
JobMeta jobMeta = new JobMeta(kjbPath, null);
设置参数
for (String param : params.keySet()) {
jobMeta.setParameterValue(param, params.get(param));
}
设置Job,即能独立跑的一个类,相当于开个线程,这么理解。
Job job = new Job(null, jobMeta);
job.start();