Java调用kjb文件

目录

一、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();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值