今天使用4.4发现跟以前的3.2还是有了些不同,这里给出一个JAVA调用api例子,例子里面包括了:
1、自定义kettle的全局配置文件目录,即KETTLE_HOME,这样就可以自己随意指定配置目录
2、能打印出对应的执行日志,然后report出来。
3、所需要的jar包:
下面是源码:
import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.Result; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.logging.CentralLogStore; import org.pentaho.di.core.logging.Log4jBufferAppender; import org.pentaho.di.core.logging.LogLevel; import org.pentaho.di.repository.Repository; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; /** * * @author ahuoo * */ public class ExecuteTransformationUtil { private static Log log = LogFactory.getLog(ExecuteTransformationUtil.class); /** * * @param filename * @param params you can set your parameters in SQL, such as ${beginDate} * @return * @throws KettleException */ public Result runTransformation(String filename,Map<String, String> params,boolean debug) throws KettleException { log.info("***************************************************************************************"); log.info("Attempting to run transformation " + filename + " from file system"); log.info("***************************************************************************************n"); TransMeta transMeta = new TransMeta(filename, (Repository) null); if(params!=null){ log.info("Attempting to read and set named parameters"); String[] declaredParameters = transMeta.listParameters(); for (int i = 0; i < declaredParameters.length; i++) { String parameterName = declaredParameters[i]; String description = transMeta.getParameterDescription(parameterName); String defaultValue = transMeta.getParameterDefault(parameterName); String parameterValue = params.get(parameterName)==null ? defaultValue : params.get(parameterName); String output = "Setting parameter " + parameterName + " to "" + parameterValue + "" [description: "" + description + "", default: "" + defaultValue + ""]"; log.info(output); transMeta.setParameterValue(parameterName, parameterValue); } } Trans transformation = new Trans(transMeta); if(debug){ transformation.setLogLevel(LogLevel.DEBUG); } log.info("Starting transformation"); transformation.execute(new String[0]); transformation.waitUntilFinished(); Result result = transformation.getResult(); log.info("Trans " + filename + " executed " + (result.getNrErrors() == 0 ? "successfullyn" : "with " + result.getNrErrors() + " errorsn")); return result; } /** * @param args * @throws KettleException */ public static void main(String[] args) throws KettleException { System.getProperties().setProperty("KETTLE_HOME","c:"+ System.getProperty("file.separator") +"home"); KettleEnvironment.init(); ExecuteTransformationUtil executor = new ExecuteTransformationUtil(); HashMap<String,String> params = new HashMap<String,String>(); params.put("statementId", "12"); Result result = executor.runTransformation("c:/tt.ktr", params,false); Log4jBufferAppender appender = CentralLogStore.getAppender(); String logText = appender.getBuffer(result.getLogChannelId(), false).toString(); log.info(logText); } }
4、转换里面的参数怎么动态设置和使用,见下图:
-Table Input参数替换 ,设计器右键,点击Transformation setting
-Execute SQL statements参数替换,注意红色的标注
5、转换里面的 Executing SQL script要小心使用,有时候它不是按照你设计的顺序执行的,原以为4.4解决了,发现还是存在这个问题,有些人说在它的后面加Blocking Step就可以解决问题了,不是很放心,还是先看看其源码,大家可以打开4.4的code:
public class Trans implements VariableSpace, NamedParams, HasLogChannelInterface, LoggingObjectInterface { public void startThreads() throws KettleException {...... case Normal: // Now start all the threads... // for (int i=0;i<steps.size();i++) { StepMetaDataCombi combi = steps.get(i); RunThread runThread = new RunThread(combi); Thread thread = new Thread(runThread); thread.setName(getName()+" - "+combi.stepname); thread.start();//此处开始执行线程 } break; case SerialSingleThreaded://此处是4.4新加的 单线程执行 new Thread(new Runnable() { public void run() { try {
public class RunThread implements Runnable { public void run() { try { step.setRunning(true); if (log.isDetailed()) log.logDetailed(BaseMessages.getString(PKG, "System.Log.StartingToRun")); //$NON-NLS-1$ while (step.processRow(meta, data) && !step.isStopped());//执行每个step } ...
}
通过查看源码发现,Normal情况下其实转换里面是并发执行的。综上所述,要想使transformation的每个step按设计的顺序执行,最好在在transformation配置里面,将Transformation engine type 设置成 Serial Single Threaded (Experimental!),根据字面意思,貌似这个功能还是实验产品,看来后续有可能进一步完善。
转载自:http://www.ahuoo.com/?p=1467
对于kettle本地保存的文件 用Java代码,来调用.kettle文件里一个步骤,运行结果报
ERROR 14-10 12:36:20,672 – Excel输入 – java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/WorkbookFactory
这里是报啥错? 没有引入jar包?
对于kettle保存的转换文件,里面的形式不就是xml的保存方式。。。。
1. 你应该吧这个jar包放到你的classpath里面
2. kettle设计器保存的文件其实就是XML
java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Sheet.getSheetName()Ljava/lang/String;
把所有包都找齐了, 还是报这个错误。 Sheet 抽象接口有这个方法啊。
是不是不同版本的jar包冲突了
使用中遇到异常,异常信息:database type with plugin id [Oracle] couldn’t be found!,增加初始化语句KettleEnvironment.init();解决,其它都参考以上源码,可以正常使用。
非常感谢作者分享。