楔子
java调用kettle,获取类似kettle界面执行结果面板步骤度量
代码
/**
* 执行 转换
*
* @param repository
* 数据库资源库
* @param path
* 转换路径
* @param tranName
* 转换名称
* @param variableMap
* 参数Map
* @throws KettleException
*/
public static boolean execTran(KettleDatabaseRepository repository, String path, String tranName, Map<String, Object> variableMap) throws KettleException {
System.setProperty("KETTLE_DEFAULT_SERVLET_ENCODING", StandardCharsets.UTF_8.name());
// 根据指定的字符串路径 找到目录
RepositoryDirectoryInterface dir = repository.findDirectory(path);
// 在 指定目录下找转换
TransMeta transMeta = repository.loadTransformation(repository.getTransformationID(tranName, dir), null);
// 设置参数
// tmeta.setParameterValue("", "");
// 设置变量 java代码中变量会覆盖kettle里面设置的变量
if (variableMap != null) {
Set<Entry<String, Object>> entrySet = variableMap.entrySet();
for (Entry<String, Object> entry : entrySet) {
transMeta.setVariable(entry.getKey(), entry.getValue().toString());
}
}
Trans trans = new Trans(transMeta);
trans.setLogLevel(LogLevel.BASIC);
trans.execute(null);// 执行trans
trans.waitUntilFinished();// 等待直到数据结束
// 几个步骤
List<StepMeta> hopsteps = transMeta.getTransHopSteps(false);
for (int i = 0; i < hopsteps.size(); i++) {
StepMeta thisStep = hopsteps.get(i);
thisStep.getName();// 步骤名称
}
// 每个步骤名称
// StepMetaDataCombi
List<StepMetaDataCombi> steps = trans.getSteps();
for (StepMetaDataCombi stepMetaDataCombi : steps) {
System.out.println(ToStringBuilder.reflectionToString(stepMetaDataCombi));
}
// kettle 界面执行面板的 步骤度量 存在这里面
System.out.println("kettle 界面执行面板的 步骤度量");
for (int i = 0; i < trans.nrSteps(); i++) {
StepInterface baseStep = trans.getRunThread(i);
StepStatus stepStatus = new StepStatus(baseStep);
// System.out.println(ToStringBuilder.reflectionToString(stepStatus));
System.out.println("stepname=" + stepStatus.getStepname() + ",errors=" + stepStatus.getErrors() + ",statusDescription=" + stepStatus.getStatusDescription());
}
String basicXml = trans.getResult().getBasicXml();
// 转换里面箭头指向
List<RowSet> rowsets = trans.getRowsets();
// 转换里面箭头指向 end
if (trans.getErrors() > 0) {
System.out.println("transformation error");
return false;
}
System.out.println("transformation successfully");
return true;
}
详细日志
执行时,会打印详细日志,但是无法直接获取这些日志,日志如下
2018/11/04 01:51:18 - A_转换 - 为了转换解除补丁开始 [A_转换]
2018/11/04 01:51:18 - A_数据输出.0 - Connected to database [life] (commit=1000)
2018/11/04 01:51:18 - A_元数据.0 - Finished reading query, closing connection.
2018/11/04 01:51:18 - A_元数据.0 - 完成处理 (I=12, O=0, R=0, W=12, U=0, E=0)
2018/11/04 01:51:18 - A_数据输出.0 - 完成处理 (I=0, O=12, R=12, W=12, U=0, E=0)
转换的结果存储在
Result
中 日志在logText
中,但是如下代码,转换
没有设置logText
public Result getResult() {
if ( steps == null ) {
return null;
}
Result result = new Result();
result.setNrErrors( errors.longValue() );
result.setResult( errors.longValue() == 0 );
TransLogTable transLogTable = transMeta.getTransLogTable();
for ( int i = 0; i < steps.size(); i++ ) {
StepMetaDataCombi sid = steps.get( i );
StepInterface step = sid.step;
result.setNrErrors( result.getNrErrors() + sid.step.getErrors() );
result.getResultFiles().putAll( step.getResultFiles() );
if ( step.getStepname().equals( transLogTable.getSubjectString( TransLogTable.ID.LINES_READ ) ) ) {
result.setNrLinesRead( result.getNrLinesRead() + step.getLinesRead() );
}
if ( step.getStepname().equals( transLogTable.getSubjectString( TransLogTable.ID.LINES_INPUT ) ) ) {
result.setNrLinesInput( result.getNrLinesInput() + step.getLinesInput() );
}
if ( step.getStepname().equals( transLogTable.getSubjectString( TransLogTable.ID.LINES_WRITTEN ) ) ) {
result.setNrLinesWritten( result.getNrLinesWritten() + step.getLinesWritten() );
}
if ( step.getStepname().equals( transLogTable.getSubjectString( TransLogTable.ID.LINES_OUTPUT ) ) ) {
result.setNrLinesOutput( result.getNrLinesOutput() + step.getLinesOutput() );
}
if ( step.getStepname().equals( transLogTable.getSubjectString( TransLogTable.ID.LINES_UPDATED ) ) ) {
result.setNrLinesUpdated( result.getNrLinesUpdated() + step.getLinesUpdated() );
}
if ( step.getStepname().equals( transLogTable.getSubjectString( TransLogTable.ID.LINES_REJECTED ) ) ) {
result.setNrLinesRejected( result.getNrLinesRejected() + step.getLinesRejected() );
}
}
result.setRows( resultRows );
if ( !Utils.isEmpty( resultFiles ) ) {
result.setResultFiles( new HashMap<String, ResultFile>() );
for ( ResultFile resultFile : resultFiles ) {
result.getResultFiles().put( resultFile.toString(), resultFile );
}
}
result.setStopped( isStopped() );
result.setLogChannelId( log.getLogChannelId() );
return result;
}
详细日志是怎么打印出来的
执行过程中,每一个步骤,都会判断 ,使用国际化配置文件打印
打印日志的java代码片段
if ( transMeta.getName() == null ) {
if ( transMeta.getFilename() != null ) {
log.logBasic( BaseMessages.getString( PKG, "Trans.Log.DispacthingStartedForFilename", transMeta
.getFilename() ) );
}
} else {
log.logBasic( BaseMessages.getString( PKG, "Trans.Log.DispacthingStartedForTransformation", transMeta
.getName() ) );
}
if ( getArguments() != null ) {
if ( log.isDetailed() ) {
log.logDetailed( BaseMessages.getString( PKG, "Trans.Log.NumberOfArgumentsDetected", String.valueOf(
getArguments().length ) ) );
}
}
if ( isSafeModeEnabled() ) {
if ( log.isDetailed() ) {
log.logDetailed( BaseMessages.getString( PKG, "Trans.Log.SafeModeIsEnabled", transMeta.getName() ) );
}
}
if ( getReplayDate() != null ) {
SimpleDateFormat df = new SimpleDateFormat( REPLAY_DATE_FORMAT );
log.logBasic( BaseMessages.getString( PKG, "Trans.Log.ThisIsAReplayTransformation" ) + df.format(
getReplayDate() ) );
} else {
if ( log.isDetailed() ) {
log.logDetailed( BaseMessages.getString( PKG, "Trans.Log.ThisIsNotAReplayTransformation" ) );
}
}