目录
一、kjb和ktr文件创建
kjb文件
ktr文件
关联kjb和ktr
变量信息
二、 Java代码调用kjb
引包
放入kjb和ktr文件
三、代码调用
定时任务
一、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();