第一步:(前提将kett中lib下的所有jar包拷贝到java项目lib目录)创建并连接资源库,如果只用这一个工作空间,可以将此段代码放入静态代码块,代码如下: 

KettleEnvironment.init();
//创建资源库对象,此时的对象还是一个空对象
KettleDatabaseRepository repository = new KettleDatabaseRepository();
//创建资源库数据库对象,类似我们在spoon里面创建资源库
//(数据库连接名称,数据库类型,连接方式,IP,数据库名,端口,用户名,密码)
DatabaseMeta dataMeta = new DatabaseMeta("数据库连接名","数据库类型(比如MSSQL)","连接方式(例如Native(JDBC))","IP","数据库名","端口号",

 "用户名","密码");
//资源库元对象,选择资源库(ID,名称,描述)
KettleDatabaseRepositoryMeta kettleDatabaseMeta =new KettleDatabaseRepositoryMeta("资源库ID", "资源库名称", "这里是描述信息",dataMeta);
//给资源库赋值
repository.init(kettleDatabaseMeta);
//连接资源库
repository.connect("admin","admin");

第二步:启动并运行job:

directoryInterface = repository.loadRepositoryDirectoryTree();
JobMeta jobMeta = repository.loadJob(jobName,directoryInterface,null,null);//从资源库中加载一个job,jobName:job名
Job job = new Job(repository,jobMeta);

job.start();//启动job,默认是线程执行。
job.waitUntilFinished();//等待job执行结束

第三步:获取job状态或者停止job:

job.stopAll();//停止job
String status=job.getStatus();//获取运行状态。

至此,java调用job的基本功能已经实现,如果现在有需求是生成web service接口,提供四个方法供外界访问,分别是传入串job名并分别执行这些job(比如“jobA,jobB,JobC”)、传入一个job名获取这个job 的当前状态、传入一个job名停止运行这个job,分享代码如下:

package com.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.RepositoryDirectoryInterface;
import org.pentaho.di.repository.kdr.KettleDatabaseRepository;
import org.pentaho.di.repository.kdr.KettleDatabaseRepositoryMeta;

import com.util.DBUtil;

public class TestOaJobX {
private static Connection con = null;
private static PreparedStatement pst = null;
private static ResultSet rs = null;

private static Repository repository;
private static List<Job> jobs;
private static String[] jobNameArray;
public TestOaJobX() {
// TODO Auto-generated constructor stub
}
static{
try {
KettleEnvironment.init();
//创建资源库对象,此时的对象还是一个空对象
KettleDatabaseRepository repository = new KettleDatabaseRepository();
//创建资源库数据库对象,类似我们在spoon里面创建资源库
//(数据库连接名称,数据库类型,连接方式,IP,数据库名,端口,用户名,密码)
DatabaseMeta dataMeta =new

DatabaseMeta("数据库连接名","数据库类型(比如MSSQL)","连接方式(例如Native(JDBC))","IP","数据库名","端口号",

 "用户名","密码");

//资源库元对象,选择资源库(ID,名称,描述)
KettleDatabaseRepositoryMeta kettleDatabaseMeta =new KettleDatabaseRepositoryMeta("资源库ID", "资源库名称", "这里是描述信息",dataMeta);
//给资源库赋值
repository.init(kettleDatabaseMeta);
//连接资源库
repository.connect("admin","admin");
TestOaJobX.repository=repository;
} catch (KettleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void setJod(String jobNames) {
//资源库目录
RepositoryDirectoryInterface directoryInterface;
try {
if(TestOaJobX.jobs==null){
directoryInterface = repository.loadRepositoryDirectoryTree();

jobNameArray=jobNames.split(",");
List<JobMeta> jobmetalist=new ArrayList<JobMeta>();
for(int i=0;i<jobNameArray.length;i++){
JobMeta jobMeta = repository.loadJob(jobNameArray[i],directoryInterface,null,null);//从资源库中加载一个job
jobmetalist.add(jobMeta);
}
TestOaJobX.jobs=new ArrayList<Job>();
for(int i=0;i<jobmetalist.size();i++){
Job job = new Job(repository,jobmetalist.get(i));
TestOaJobX.jobs.add(job);
}
}
} catch (KettleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void runJob(String jobNames){
setJod(jobNames);
String[] tmpname=jobNames.split(",");
for(int i=0;i<jobs.size();i++){
System.out.println("第"+(i+1)+"项作业:"+tmpname[i]+" 开始执行");
//jobs.get(i).start();
//jobs.get(i).run();
try {
jobs.get(i).execute(i, null);
} catch (KettleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
jobs.get(i).waitUntilFinished();
System.out.println("第"+(i+1)+"项作业:"+tmpname[i]+" 执行完毕");
if(jobs.get(i).getErrors()>0){
System.out.println("第"+(i+1)+"项作业:"+tmpname[i]+" 执行失败!");
}else{
System.out.println("第"+(i+1)+"项作业:"+tmpname[i]+" 执行成功!");
}
}
}
public void stopJob(String jobName) {
if(jobNameArray!=null){
int m=0;
for(int i=0;i<jobNameArray.length;i++){
if(jobName.equals(jobNameArray[i])){
m=i;
}
}
jobs.get(m).stopAll();
if(jobs.get(m).getErrors()>0){
System.out.println("第"+(m+1)+"项作业:"+jobName+" 停止异常!");
}else{
System.out.println("第"+(m+1)+"项作业:"+jobName+" 停止成功!");
}
}else{
System.out.println("该作业未运行");
}
}
public String getStatus(String jobName) {
if(jobNameArray!=null){
int m=0;
for(int i=0;i<jobNameArray.length;i++){
if(jobName.equals(jobNameArray[i])){
m=i;
}
}
String status=jobs.get(m).getStatus();
return status;
}else{
System.out.println("该作业未运行");
return null;
}
}
public void errorView(String jobName) {
con=DBUtil.getConnection();
String sql="select * from ERROR_LOG where KJBNAME = ? order by ERROETIME desc";
try {
pst=con.prepareStatement(sql);
pst.setString(1,jobName);
rs=pst.executeQuery();
if(rs!=null){
while(rs.next()){
System.out.println(rs.getString("KJBNAME")+" "+
rs.getString("KTRNAME")+" "+
rs.getString("ERRORINFO")+" "+
rs.getString("ERROETIME"));
}
}
pst.close();
rs.close();
con.close();
}catch(Exception e){
e.printStackTrace();
}
}
}

然后生成接口就行了。

现在有一个问题有待于解决,就是job的start、run、和execute方法都可以执行job,但是用job.start后不能第二次执行这个方法,但是run和execute可以

转载于:https://www.cnblogs.com/kenlyy/p/4987527.html

java中调用kettle作业以及生成web service 接口相关推荐

  1. java中调用 dll 动态库的简洁方法 JNative

    Java中调用DLL方法,是通过JNI接口实现的,http://www.ibm.com/developerworks/cn/java/l-linux-jni/ 这里有详细的说明.大概是先用Java写一 ...

  2. java中调用dll文件的两种方法

    https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...

  3. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  4. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  5. 如何通过JNI在Java中调用C库函数

    使用Java语言进行开发时,可能由于处理速度.硬件控制或者复用既有的C/C++模块等方面的原因,需要Java层与使用C/C++编写的应用.模块或库进行交互,共同完成某些任务.在两者之间充当连接桥梁作用 ...

  6. java中调用数组参数_java中如何调用带有数组类型参数的存储过程

    java中如何调用带有数组类型参数的存储过程 关注:95  答案:3  mip版 解决时间 2021-01-28 00:39 提问者万丈深渊 2021-01-27 14:00 不知道java中java ...

  7. Java中调用C++代码

    Java中调用C++代码 1.Idea创建一个Solution类 public class Solution {public native void sayHello();static{System. ...

  8. 一步一步教会你JAVA中调用C++

    装载自:http://blog.csdn.net/chenjin_zhong/article/details/5870305 一.JNI简介 JNI:Java Native Interface,是Ja ...

  9. Java 中调用 Apache API 实现图片文件的 压缩 与 解压 实例

    < Java 中调用 Apache API 实现图片文件的 压缩 与 解压 > 为什么不直接使用 Java JDK 中自带的 API 呢?必须使用 Apache API 实现文件的压缩与解 ...

最新文章

  1. 厉害了,我的Python,竟然可以这么玩儿......(内含福利)
  2. 基于高德地图Windows Phone API 快速开发地图相关APP(二)
  3. linux挂载windows共享的文件夹
  4. Spring DI依赖注入讲解
  5. win32汇编指令汇总
  6. jboss fuse 教程_JBoss Fuse –使用MVEL将您的静态配置转换为动态模板
  7. Python3有效括号问题
  8. 2022年最新javaEE学习路线图
  9. FPGA跨时钟域处理方法延迟法
  10. 微信小程序Server端环境配置
  11. 用户操作计算机的方法,操作者向计算机输入信息最常用的方法是(B).doc
  12. WCF中使用自定义behavior提示错误的解决方法
  13. java中volatile关键字_Java中Volatile关键字详解
  14. Delphi教程推荐
  15. K3CLOUD安装教程
  16. 香橙派上手记录(orangepi pc)
  17. python的基础列表_python基础入门 列表
  18. String类的intern方法学习
  19. java三国演义_《三国演义》歌曲精品全集
  20. android qq聊天图片无法显示,QQ聊天时无法打开图片

热门文章

  1. Ice “Hello World”的实现
  2. Openfiler 排错
  3. 如何彻底解决安装Windows漏洞补丁出现蓝屏或无法启动问题?
  4. jittor和pytorch 生成网络对比之clustergan
  5. 注意力不集中的判断标准
  6. React 教程:快速上手指南
  7. 编写驱动的makefile使要
  8. DigitalOcean云平台的虚拟机推荐
  9. 独角兽之名:解读华云数据背后智慧商业谋略
  10. NB-IoT这块热豆腐公认可口 但勿太心急