楔子

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);// 执行transtrans.waitUntilFinished();// 等待直到数据结束// 几个步骤List<StepMeta> hopsteps = transMeta.getTransHopSteps(false);for (int i = 0; i < hopsteps.size(); i++) {StepMeta thisStep = hopsteps.get(i);thisStep.getName();// 步骤名称}// 每个步骤名称// StepMetaDataCombiList<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();// 转换里面箭头指向 endif (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" ) );}}

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

  1. kettle详解(数据抽取、转换、装载)

    一:下载路径 当你要学习一个工具时,往往一开始就找不到下载路径,也不知道是为什么,连个官网都找不到,最后还是问的别人要的路径,做程序好心酸. http://community.pentaho.com/ ...

  2. KETTLE执行监控(一):界面配置方式

    文章目录 准备 日志表的建表语句 作业日志表 作业日志通道表 转换日志表 转换步骤日志表 转换 前提 转换日志表 转换步骤日志表 作业 前提 作业日志表 作业日志通道表 准备 日志表的建表语句 基于o ...

  3. kettle中使用javascript步骤和fireToDB函数实现自己定义数据库查询

    kettle中使用javascript步骤和fireToDB函数实现自己定义数据库查询 如果你须要实现非传统的数据库查询操作.为了讨论这样的情景,我们如果你须要读取数据库中的正則表達式,然后检查输入的 ...

  4. PDI(kettle) 阻塞数据直到步骤都完成、Blocking step组件用法及区别

    阻塞数据直到步骤都完成 此步骤只是等待,直到对话框中指定的所有步骤副本都完成.可以使用它来避免转换步骤副本之间存在的自然并发(并行) 描述: **监视下面的步骤:**在此表格中指定要等待的步骤,可点击 ...

  5. 在代码中定义一个执行线程的步骤

    在代码中定义一个执行线程的步骤 方法(一)   >>继承Thread类   >>重新run()方法   >>调用start()方法         >> ...

  6. IIS7 设置读取、脚本和可执行文件的执行权限的步骤

    这篇文章主要介绍了IIS7 设置读取.脚本和可执行文件的执行权限的步骤,需要的朋友可以参考下 对IIS服务器,通过配置功能权限可以设置访问策略,访问策略指定 IIS 中 Web 服务器.站点.应用程序 ...

  7. mybatis执行的核心步骤

    本文来说下mybatis执行的核心步骤 文章目录 概述 概述 mybatis执行的核心步骤 读取 mybatis 的 mybatis-config.xml 配置文件 加载映射文件 构建 SQLSess ...

  8. 在JSP中,点击网页某个按钮或者超链接执行某些需要确认的命令时,弹出确认框如下效果: 如果点击确定,则执行要操作的命令。如果点击取消则不执行。 实现步骤: 1:在jsp,或者html

    如下效果: 如果点击确定,则执行要操作的命令.如果点击取消则不执行. 实现步骤: 第1步 在jsp,或者html页面的的<head></head>标签之间添加如下js代码: & ...

  9. chrome谷歌浏览器执行js脚本步骤

    描述:chrome谷歌浏览器执行js脚本步骤 步骤: F12-顶部Sources-左侧栏箭头Snippets-添加脚本New snippet-RUN

  10. js 等待方法返回结果再执行下面的步骤

    错误起因 业务方法 方法调用 返回结果 可以发现,没等拿到结果就打印了 需求 等拿到返回值了再执行下面的步骤 修正 使用Promise返回结果 加入async await 执行结果

最新文章

  1. 【机器学习】集成模型方法
  2. 前端学习(1834):前端面试题之从url里面输入网址
  3. js模块化编程之彻底弄懂CommonJS和AMD/CMD!
  4. A Data Access Layer to persist business objects using attributes and reflection - Part III [无常译]...
  5. python的array从0开始吗_为什么数组是从0开始的
  6. R语言 相关分析和典型相关分析
  7. 安装JDK_Tomcat
  8. VIIRS-NPP夜光遥感数据下载
  9. 书评《鸟哥的Linux私房菜 基础学习篇》第四版
  10. screen linux卸载,Ubuntu常用软件安装(附截图软件、FTP、卸载命令)
  11. PR——轨道遮罩-玻璃滑动效果
  12. linux下企业邮件服务器的搭建
  13. 解决登录vCenter提示“当前网站安全证书不受信任“
  14. Python的学习笔记案例8--空气质量指数计算1.0
  15. 在cmd运行java_用cmd运行java时的问题
  16. Linux常用命令——ss命令
  17. npm ERR! code E404 npm ERR! 404 Not Found - GET https://registry.npmjs.com/address-pares - Not found
  18. 解三元一次方程组的计算机,解三元一次方程组
  19. 安卓开发5-fragment和activity
  20. 上海擎标助力中国移动山东公司通过ISO22301业务连续性认证

热门文章

  1. 服务器发送消息给客户端,服务器如何发送消息给客户端
  2. python打印列表中指定元素的所有下标(5种方法)
  3. Alibaba Cloud Linux 搭建Frp内网穿透服务(兼容Centos)
  4. iOS跳转到设置和其他APP的那些事
  5. MC开服教程2:材质包法自定义唱片音乐
  6. 微信小游戏Laya引擎声音Bug的解决方案
  7. 计算机应用期刊投中难吗,计算机应用研究投稿水平高吗
  8. php如何进行seo,如何做百度SEO?有哪些技巧?
  9. jquery.printarea.js 局部打印去掉页眉页脚
  10. 我熬夜开发了一款简约实用、支持多平台的Markdown在线编辑器(开源)