有时候我们想在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的包。

代码逻辑如下:

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(), null, null); JobExecutionConfiguration jobExecutionConfiguration = new JobExecutionConfiguration();
jobExecutionConfiguration.setRemoteServer(remoteSlaveServer);// 配置远程服务 String lastCarteObjectId = Job.sendToSlaveServer(jobMeta, jobExecutionConfiguration, null, null);
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执行的日志信息。

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

还有一个问题就是,我的job文件需要在本地保存一份,最开始我一直想的是我的job文件放到KETTLE所在服务器上,在代码中我指定指向job文件的路劲即可,但是运行的时候,kettle总是去本地路劲找文件然后找不到就报错。后来我想可能我的这种想法需要依赖kettle的资源库才能实现。而我没有使用资源库所以我必须在我java程序所在服务器放置job文件,然后去kettle所在远程服务器执行。

如果有朋友能解决我最后的疑虑,还望留言指点。谢谢!

java程序控制KETTLE JOB的执行的更多相关文章

  1. java调用kettle的job和transfer工具类

    package com.woaiyitiaocai.util; import java.util.Map; import java.util.UUID; import org.apache.log4j ...

  2. 【Kettle】Java借助Kettle将Excel导入数据

    示例功能(仅供测试): 在JAVA项目中,将数据从Excel文件导入数据库中.实现该能有多种方法,而本例则是“不走寻常路”,尝试借助Kettle实现数据导入. 原理: Java中调用存储在Kettle ...

  3. java中如何生成可执行的jar文件

    java中如何生成可执行的jar文件 最简单的方法就是: jar -cfe Card.jar CardLayoutDemo CardLayoutDemo$1.class CardLayoutDemo$ ...

  4. "Java 反序列化"过程远程命令执行漏洞

    一.漏洞描述   国外 FoxGlove 安全研究团队于2015年11月06日在其博客上公开了一篇关于常见 Java 应用如何利用反序列化操作进行远程命令执行的文章.原博文所提到的 Java 应用都使 ...

  5. 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类

    一.背景 最近在使用记事本编写带有包名并且有继承关系的java代码并运行时发现出现了很多错误,经过努力一一被解决,今天我们来看一下会遇见哪些问题,并给出解决办法. 二.测试过程 1.父类代码 pack ...

  6. 在windows下使用cmd命令行对java文件进行编译和执行

    windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量 相关配置链接:java基础学习总结—— ...

  7. Java Swing jpanel paint方法执行两次的问题

    Java Swing jpanel paint方法执行两次的问题: 在其他环境下执行了两次,自己测试怎么都是执行了一次,记录一下这个问题:需要后继工作: 可能是进行各种参数设置的时候导致了paint方 ...

  8. java之生成可重复执行的sql脚本

    在实际项目开发过程中,sql脚本需要多次执行.而一般的DML和DDL语句一般只能执行一次,再次执行执行时就会报错(操作对应已存在/不存在),所以必须将sql脚本生成可重复执行的.本文共分为4部分:1. ...

  9. [学习笔记]java基础Java8SE开发环境搭建、第一个Java Hello World、Java程序的编译与执行

    本文作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/25745945 内容简介: ------------ ...

随机推荐

  1. Java Minor GC和FullGC

    Minor GC触发条件:当Eden区满时,触发Minor GC. Full GC触发条件: 调用System.gc时,系统建议执行Full GC,但是不必然执行 老年代空间不足 方法去空间不足 通过 ...

  2. 服务器jupyter配置与ssh远程登录

    jupyter 配置 首先安装jupyter,在anaconda套装中已包含,如果安装的是精简版的miniconda则通过conda install jupyter安装. 生成配置文件 jupyter ...

  3. 【安全测试】Web应用安全之XSS跨站脚本攻击漏洞

    前言 以前都只是在各类文档中见到过XSS,也进行过相关的学习,但是都是一知半解,过了一段时间就忘了. 前几天我们收到了了一份标题为<XX账号昵称参数中存在存储XSS漏洞>的报告文档,来源是 ...

  4. Presto改造

    最近在打造一款可视化分析产品, 需要用到组合多数据源, 进行查询, 看了挺多开源的插件, 发现目前只有Presto比较符合, 但是由于Presto没有多用户机制和资源管理, 所以需要在这基本上构建多用 ...

  5. 一. Spring框架防XXS跨站攻击

    使用 Spring 框架进行 Java Web 开发,可以在 web.xml 文件中设置 HTML encode,在 JSP 文件页面元素 form 中确定实施. web.xml 加上: <co ...

  6. Linux下weblogic启动报错unable to get file lock的问题

    非正常结束weblogic进程导致weblogic无法启动 由于先前服务器直接down掉了,所有进程都非正常的进行关闭了,也就导致了下次启动weblogic的时候报了以下错误:<2012-3-2 ...

  7. IOS-网络(HTTP请求、同步请求、异步请求、JSON解析数据)

    // // ViewController.m // IOS_0129_HTTP请求 // // Created by ma c on 16/1/29. // Copyright © 2016年 博文科 ...

  8. 044——VUE中组件之使用内容分发slot构建bootstrap面板panel

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. protel 99se 全部焊盘和过孔补泪滴,很多都是失败的,对板子有影响吗?补泪滴的作用?

    泪滴     是焊盘与导线或者是导线与导孔之间的滴装连接过度,设置泪滴的目的是在电路板受到巨大外力的冲撞时,避免导线与焊盘或者导线与导孔的接触点断开,另外,设置泪滴也可使PCB电路板显得更加美观.te ...

  10. c++ istringstream的用法

    一.测试代码 istringstream 是将字符串变成字符串迭代器一样,将字符串流在依次拿出,比较好的是,它不会将空格作为流.这样就实现了字符串的空格切割. #include<iostream ...