java程序控制KETTLE JOB的执行

有时候我们想在java程序中触发远程服务器上kettle job的执行,并且获得执行结果。kettle的carte提供了远程执行job和transfer的功能。

我使用的kettle是6.1版本,部署在linux服务器上,没有使用资源库。

下面介绍下各个步骤:为了方便以windows系统为例

1、开启carte服务,在kettle安装目录下,运行Carte.bat,直接上图

直接打Carte.bat后面不带任何参数就可以看到参数介绍,我这里在本机8081端口开启服务,看到最后的文字说明服务启动成功。

 

2、在浏览器中查看kettle 状态

在浏览器中输入http://172.20.17.113:8081,会提示输入密码,这里先直接输入cluster/cluster,然后可以进入,页面上会显示通过carte执行的job和transfer的状态。

那么这个用户名密码在哪设置呢?我找了半天,也是网上看前辈指引,原来是在kettle安装目录/pwd下面,大家可以看到有carte-config-8081到8084这些配置文件,还有carte-config-master-8080.xml,应该是做主从集群用的,先不管了。

打开carte-config-8081.xml就可以看到

<slaveserver>
<name>slave1-8081</name>
<hostname>localhost</hostname>
<port>8081</port>
<username>cluster</username>
<password>cluster</password>
<master>N</master>
</slaveserver>

端口号跟用户名密码的默认配置都在这里了。

 

3、使用java触发JOB执行。

下面介绍真正要做的事情了,建立java project。把kettle安装目录/lib下面相关jar包依赖上去。需要的包挺多的,懒得话全部依赖吧。我这边依赖这些包就够了,因为用到了spring读取文件的工具,也依赖了spring的包。

 

代码逻辑如下:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

package com.lzh.kettle;

 

import org.pentaho.di.cluster.SlaveServer;

import org.pentaho.di.core.KettleEnvironment;

import org.pentaho.di.core.Result;

import org.pentaho.di.job.Job;

import org.pentaho.di.job.JobExecutionConfiguration;

import org.pentaho.di.job.JobMeta;

import org.pentaho.di.www.SlaveServerJobStatus;

import org.springframework.core.io.FileSystemResource;

 

public class kettleRemoteDemo {

    public static void main(String[] args) {

        String jobPath = "E:\\ws0815\\xnol-reporting-app-trunk\\etl\\kettle\\jobs\\jb_current_account_order_latest5.kjb";

        try {

            KettleEnvironment.init();

 

            SlaveServer remoteSlaveServer = new SlaveServer();

            remoteSlaveServer.setHostname("172.20.17.113");// 设置远程IP

            remoteSlaveServer.setPort("8081");// 端口

            remoteSlaveServer.setUsername("cluster");

            remoteSlaveServer.setPassword("cluster");

            FileSystemResource r = new FileSystemResource(jobPath);

            // jobname 是Job脚本的路径及名称

            JobMeta jobMeta = new JobMeta(r.getInputStream(), nullnull);

 

            JobExecutionConfiguration jobExecutionConfiguration = new JobExecutionConfiguration();

            jobExecutionConfiguration.setRemoteServer(remoteSlaveServer);// 配置远程服务

 

            String lastCarteObjectId = Job.sendToSlaveServer(jobMeta, jobExecutionConfiguration, nullnull);

            System.out.println("lastCarteObjectId=" + lastCarteObjectId);

            SlaveServerJobStatus jobStatus = null;

            do {

                Thread.sleep(5000);

                jobStatus = remoteSlaveServer.getJobStatus(jobMeta.getName(), lastCarteObjectId, 0);

            while (jobStatus != null && jobStatus.isRunning());

            Result oneResult = new Result();

            System.out.println(jobStatus);

            if (jobStatus.getResult() != null) {

                // 流程完成,得到结果

                oneResult = jobStatus.getResult();

                System.out.println("Result:" + oneResult);

            else {

                System.out.println("取到空了");

            }

        catch (Exception e1) {

            e1.printStackTrace();

        }

 

    }

}

 这里因为job执行需要一些时间,我代码里面每隔5秒去拿一下结果,拿到结果确定job是否执行完成。

这时候如果我们去浏览器查看,可以看到job正在执行的状态。

执行完成之后Running会变成Finish,如果有异常,status也会有提示。在命令行下面也会有job执行的日志信息。

大致过程就是这样,但是我研究的时候还是花了不少时间,网上资料不是很多,我这个算是完整介绍吧。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过Java程序调用Kettle的API来向Job和Transformation传递参数。以下是一个示例代码: ```java import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.variables.Variables; import org.pentaho.di.repository.Repository; import org.pentaho.di.repository.RepositoryDirectoryInterface; import org.pentaho.di.repository.kdr.KettleDatabaseRepository; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.TransParameterCodec; import java.util.HashMap; import java.util.Map; public class KettleJobCaller { public static void main(String[] args) throws KettleException { KettleEnvironment.init(); String repositoryName = "MyRepository"; String username = "admin"; String password = "password"; String jobName = "MyJob"; String transformationName = "MyTransformation"; String[] parameters = new String[]{"param1=value1", "param2=value2"}; Repository repository = new KettleDatabaseRepository(); repository.init(repositoryName, username, password); RepositoryDirectoryInterface directory = repository.loadRepositoryDirectoryTree().findDirectory("/my/directory"); Variables variables = new Variables(); variables.setParameters(parameters); TransMeta transMeta = repository.loadTransformation(transformationName, directory, variables, null); Trans trans = new Trans(transMeta); trans.execute(null); String[] encodedParameters = TransParameterCodec.encodeParams(parameters); Map<String, String> paramMap = new HashMap<>(); for (String encodedParameter : encodedParameters) { String[] split = encodedParameter.split("="); paramMap.put(split[0], split[1]); } JobMeta jobMeta = repository.loadJob(jobName, directory, variables, null); Job job = new Job(repository, jobMeta, variables); job.setVariables(variables); job.setParams(paramMap); job.start(); job.waitUntilFinished(); } } ``` 在上面的示例代码中,我们首先初始化Kettle的环境,然后指定仓库名称、用户名、密码、Job名称和Transformation名称。接下来,我们将要传递的参数存储在一个字符串数组中,并将它们传递给Transformation和Job。在传递参数时,我们需要使用变量来存储它们。 最后,我们使用Kettle的API来加载Transformation和Job,并将参数传递给它们。注意,我们需要使用TransParameterCodec来编码和解码参数。 这就是如何使用Java调用Kettle Job并传递参数的示例代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值