kettle执行结果面板步骤度量(一)——转换

本文介绍如何使用Java代码调用Kettle执行数据转换任务,包括设置参数、执行转换、获取步骤度量及结果日志的方法。通过具体代码示例,展示了如何获取类似Kettle界面执行结果面板的步骤度量。

楔子

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" ) );
      }
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值