项目中用到kettle想在web中调用,结合网上资料,整理如下,
1,导入所需jar 包,我这里用的是kettle 5.0版本
2 kettle执行工具类
package com.ht.um.util;
import java.io.File;
import java.util.Map;
import java.util.UUID;
import org.apache.log4j.Logger;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.core.util.EnvUtil;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
public class KettleUtil {
private static Logger logger_info = Logger.getLogger("api-info");
private static Logger logger_error = Logger.getLogger("api-error");
/**
* 执行job
* @param initKettleParam
* @param kjbFilePath
* @param kjbFilePath
* @return
*/
public static boolean runKettleJob(Map<String,String> initKettleParam, String kjbFilePath,String kettleHome) {
String uuid = UUID.randomUUID().toString();
logger_info.info("ExecKettleUtil@runKettleJob:"+uuid+" {kjbFilePath:"+kjbFilePath+"}");
try {
innitKettleEnvironment(kettleHome);
//初始化job路径
JobMeta jobMeta = new JobMeta(kjbFilePath, null);
Job job = new Job(null, jobMeta);
//初始化job参数,给kettle文件中的命名参数 设值
for (String variableName : initKettleParam.keySet()) {
//job.setParameterValue("eee", "1111111111");这样不行,下面这种就可以,不知道为什么
job.getJobMeta().setParameterValue(variableName, initKettleParam.get(variableName));
}
// job.execute(0, null);
//开始执行
job.start();
//等待转换执行结束
job.waitUntilFinished();
// System.out.println("*******job.getParameterValue****"+job.getParameterValue("btime"));
//System.out.println("*******job.getParameterValue****"+job.getParameterValue("eee")+"***********");
// System.out.println("**** job.getParameterDefault*******"+ job.getParameterDefault("btime"));
if (job.getErrors() > 0) {
logger_info.info("ExecKettleUtil@runKettleJob:"+uuid+" 执行失败");
}else{
logger_info.info("ExecKettleUtil@runKettleJob:"+uuid+" 执行成功");
}
return true;
} catch (Exception e) {
logger_error.error("ExecKettleUtil@runKettleJob:"+uuid, e);
return false;
}
}
/**
* @功能描述: 执行Transfer
* @使用对象: woaiyitiaocai
* @创建作者: woaiyitiaocai
* @创建日期: 2017年2月27日 下午3:51:33
* @param initKettleParam Transfer参数
* @param ktrFilePath Transfer路径
* @return
*/
/**
* 执行Transfer
* @param initKettleParam 参数
* @param ktrFilePath 路径
* @param kettleHome
* @return
*/
public static boolean runKettleTransfer(Map<String,String> initKettleParam, String ktrFilePath,String kettleHome) {
Trans trans = null;
String uuid = UUID.randomUUID().toString();
//String[]params={"2017-01-01","2017-01-04"};
logger_info.info("runKettleTransfer:"+uuid+" {ktrFilePath:"+ktrFilePath+"}");
try {
//初始化
innitKettleEnvironment(kettleHome);
EnvUtil.environmentInit();
TransMeta transMeta = new TransMeta(ktrFilePath);
//转换
trans = new Trans(transMeta);
//初始化trans参数,脚本中获取参数值:${variableName}
for (String variableName : initKettleParam.keySet()) {
//trans.setVariable(variableName, initKettleParam.get(variableName));
//设置命名参数
trans.setParameterValue(variableName, initKettleParam.get(variableName));
}
//执行转换
trans.execute(null);//这个方法可以设置命令行参数
// System.out.println("***********"+trans.getParameterValue("btime"));
// trans.prepareExecution(null);//异常处理
// trans.startThreads();//开始执行
//等待转换执行结束
trans.waitUntilFinished();
if (trans.getErrors() > 0) {
logger_info.info("runKettleTransfer:"+uuid+" 执行失败");
}else{
logger_info.info("runKettleTransfer:"+uuid+" 执行成功");
}
return true;
} catch (Exception e) {
logger_error.error("runKettleTransfer:"+uuid, e);
return false;
}
}
/**
* 初始化
* @param kettleHome 项目中.kettle/kettle.properties 所在路径
*/
public static void innitKettleEnvironment(String kettleHome) {
try {
if (!KettleEnvironment.isInitialized()) {
// 获得执行类的当前路径
String user_dir = System.getProperty("user.dir");
// Kettle初始化需要修改相应的配置路径
System.setProperty("KETTLE_HOME", kettleHome);
System.setProperty("user.dir", kettleHome);
// 运行环境初始化(设置主目录、注册必须的插件等)
KettleEnvironment.init();
// Kettle初始化完毕,还原执行类的当前路径
System.setProperty("user.dir", user_dir);
}
} catch (KettleException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3,在spoon中创建转换文件
设置命名参数,在转换中右击,选择-》转换设置-》弹出转换属性 可以设置命名参数
参数使用直接${} 或‘${}’