文章目录

  • 启动
  • Spoon
  • Carte
  • Pan
  • kitchen

启动

对于kettle来说,整个程序的入口是launcher.jar
调用反射,实现其他命令功能:

public static void main(String[] args) throws Exception {Parameters parameters = Parameters.fromArgs(args, System.err);URL location = Launcher.class.getProtectionDomain().getCodeSource().getLocation();File appDir = FileUtil.computeApplicationDir(location, new File("."), System.err);File configurationFile = new File(appDir, "launcher.properties");Properties configProperties = new Properties();try {configProperties.load(new FileReader(configurationFile));} catch (Exception var13) {}Configuration configuration = Configuration.create(configProperties, appDir, parameters);if (configuration.isUninstallSecurityManager()) {System.setSecurityManager((SecurityManager)null);}Iterator var7 = configuration.getSystemProperties().entrySet().iterator();while(var7.hasNext()) {Entry<String, String> systemProperty = (Entry)var7.next();System.setProperty((String)systemProperty.getKey(), (String)systemProperty.getValue());}List<URL> jars = FileUtil.populateClasspath(configuration.getClasspath(), appDir, System.err);jars.addAll(FileUtil.populateLibraries(configuration.getLibraries(), appDir, System.err));URL[] classpathEntries = (URL[])((URL[])jars.toArray(new URL[jars.size()]));ClassLoader cl = new URLClassLoader(classpathEntries);Thread.currentThread().setContextClassLoader(cl);if (StringUtil.isEmpty(configuration.getMainClass())) {System.err.println("Invalid main-class entry, cannot proceed.");System.err.println("Application Directory: " + appDir);System.exit(1);}if (configuration.isDebug()) {System.out.println("Application Directory: " + appDir);for(int i = 0; i < classpathEntries.length; ++i) {URL url = classpathEntries[i];System.out.println("ClassPath[" + i + "] = " + url);}}Class<?> mainClass = cl.loadClass(configuration.getMainClass());String[] newArgs = new String[args.length - parameters.getParsedArgs()];System.arraycopy(args, parameters.getParsedArgs(), newArgs, 0, newArgs.length);Method method = mainClass.getMethod("main", String[].class);method.invoke((Object)null, newArgs);}

Spoon

spoon是kettle的gui客户端,用户的第一界面入口。包括其他的carte pan等,也是复用的spoon的功能,只是在入口参数不同,具体可以参考bat或者sh的脚本命令,查看细节。

swing的应用程序入口:

class Spoon extends ApplicationWindow implements AddUndoPositionInterface, TabListener, SpoonInterface,OverwritePrompter, PDIObserver, LifeEventHandler, XulEventSource, XulEventHandler, PartitionSchemasProvider

https://wiki.pentaho.com/display/EAI/Monitoring+SWT+Graphics+Resources+with+Sleak

需要注意的一点kettle有不少信息是需要放置在环境变量里的

spoon的界面使用了xul的xml文件进行定义。如导航页,工具栏,通过插件的形式,实现了解耦。
在启动spoon的脚本里,通过脚本传递的参数:%_cmdline%
这里的脚本参数就通过shift和goto加了进来。

if %1!==! goto EndArg
set _cmdline=%_cmdline% %1
shift
goto TopArg
...
%SPOON_START_OPTION% "%_PENTAHO_JAVA%" %OPT% -jar launcher\launcher.jar -lib ..\%LIBSPATH% %_cmdline%

Carte

提供web服务。使用jetty作为servlet容器。
jetty文档
jetty下载

jetty的Server本身是一个handle和ThreadPool,在这里添加了一个运行时的hook:WebServerShutdownHook,在spoon的jvm关闭时,进行优雅server关闭。

public WebServer( LogChannelInterface log, TransformationMap transformationMap, JobMap jobMap,SocketRepository socketRepository, List<SlaveServerDetection> detections, String hostname, int port, boolean join,String passwordFile, SslConfiguration sslConfig ) throws Exception {// omit set fields methodstartServer(); //启动服务器startSlaveMonitoring(); //启动监听webServerShutdownHook = new WebServerShutdownHook( this );Runtime.getRuntime().addShutdownHook( webServerShutdownHook );try {ExtensionPointHandler.callExtensionPoint( log, KettleExtensionPoint.CarteStartup.id, this );} catch ( KettleException e ) {log.logError( "Error calling extension point CarteStartup", e );}if ( join ) {server.join();}}

在这个流程里,启动服务是比较复制的操作。将2部分的接口注册到jetty的路由中:

kettle的启动也是蛮有意思,主流程是放在Spoon.bat的脚本中,最终的启动jar通过参数来启动:

call Spoon.bat -main org.pentaho.di.www.Carte %*

比如carte服务,就是打开了Carte的main方法:

判断程序参数是一个还是2个:

  • 一个参数: xml文件路径
  • 2个参数:username,pwd
if ( arguments.length == 1 && !Utils.isEmpty( arguments[0] ) ) {if ( cmd.hasOption( 's' ) ) {throw new Carte.CarteCommandException( BaseMessages.getString( PKG, "Carte.Error.illegalStop" ) );}usingConfigFile = true;FileObject file = KettleVFS.getFileObject( arguments[0] );Document document = XMLHandler.loadXMLFile( file );setKettleEnvironment(); // Must stand up server now to allow decryption of passwordNode configNode = XMLHandler.getSubNode( document, SlaveServerConfig.XML_TAG );config = new SlaveServerConfig( new LogChannel( "Slave server config" ), configNode );if ( config.getAutoSequence() != null ) {config.readAutoSequences();}config.setFilename( arguments[0] );}if ( arguments.length == 2 && !Utils.isEmpty( arguments[0] ) && !Utils.isEmpty( arguments[1] ) ) {String hostname = arguments[0];String port = arguments[1];if ( cmd.hasOption( 's' ) ) {String user = cmd.getOptionValue( 'u' );String password = cmd.getOptionValue( 'p' );shutdown( hostname, port, user, password );System.exit( 0 );}


Pan

执行转换
参数:

  1. -version 显示版本信息
  2. -file=filename 运行的文件
  3. -param:key=value 指定命名参数
  4. -log=logging filename 设置日志文件
  5. -level=logging level 设置日志级别

示例:指定基本log,执行一个ktr转换
命令如下:

1.windows平台

pan.bat /file:D:\kettle\kettletest\ktr.ktr /level:Basic>D:\kettle\kettletest\ktr.log

2.linux 中,参数以 –分隔

./pan.sh -file=/usr/local/kettle/ktr/ktr.ktr >> /usr/local/kettle/ktr/ktr.log

kitchen

执行作业

  1. -rep:Repository name 任务包所在存储名
  2. -user:Repository username 执行人
  3. -pass:Repository password 执行人密码
  4. -job:The name of the job to launch 任务包名称
  5. -dir:The directory(don’tforget the leading /or) 文件夹
  6. -file:The file name(JobXML)to launch 要启动的文件名
  7. -level:The logging level(Basic,Detailed,Debug,Rowlevel,Error,Nothing)指定日志级别

Error: 只显示错误
Nothing: 不显示任何输出
Minimal: 只使用最少的记录
Basic: 这是默认的基本日志记录级别
Detailed: 详细的日志输出
Debug: 以调试为目的,非常详细的输出
Rowlevel: 使用行级记录,会产生大量的数据

  1. -log:The logging file to write to 指定日志文件
  2. -listdir:List the directories in the repository 列出指定存储中的目录结构。
  3. -listjobs:List the jobs in the specified directory 列出指定目录下的所有任务
  4. -listrep:List the defined repositories 列出所有的存储
  5. -norep:Don’t log into the repository 不写日志

1.windows中:

kitchen /file:D:\kettle\kettletest\job.job /level:Basic>D:\kettle\kettletest\job.log

2.linux 中,参数以 –分隔

./kitchen .sh -file=/usr/local/kettle/job.job >> /usr/local/kettle/ktr/job.log

kettle源码分析之1启动流程(IDEA启动carte调试)相关推荐

  1. kettle源码分析之3 carte与rest api

    文章目录 安装 用户认证 基础认证 cookie认证 服务调用 文件管理 目录资源 文件资源 数据源 Carte Schedules 用户角色中心 安装 软硬件要求 9.0版本需要安装licence ...

  2. HDFS源码分析DataXceiver之整体流程

    在<HDFS源码分析之DataXceiverServer>一文中,我们了解到在DataNode中,有一个后台工作的线程DataXceiverServer.它被用于接收来自客户端或其他数据节 ...

  3. Fuchsia源码分析--系统调用流程

    Fuchsia源码分析--系统调用流程 以zx_channel_create为例 Fuchsia系统调用的定义 Fuchsia系统调用定义文件的编译 Fuchsia系统调用用户空间的调用流程 zx_c ...

  4. 【SA8295P 源码分析】12 - HQX Display(OpenWFD)调试命令介绍

    [SA8295P 源码分析]12 - HQX Display(OpenWFD)调试命令介绍 一.HQX Display 介绍 二.HQX Display 配置文件参数解析 三.QNX 仪表屏 Brin ...

  5. Kettle源码分析

    最近做一个大型项目需要做数据的抽取和标准化处理,我们利用一款国外的开源工具Kettle,对Kettle的核心包进行二次开发,应用到我们的Java项目中. Kettle工具:https://source ...

  6. Redis源码分析:基础概念介绍与启动概述

    Redis源码分析 基于Redis-5.0.4版本,进行基础的源码分析,主要就是分析一些平常使用过程中的内容.仅作为相关内容的学习记录,有关Redis源码学习阅读比较广泛的便是<Redis设计与 ...

  7. F2FS源码分析-5.2 [数据恢复流程] 后滚恢复和Checkpoint的作用与实现

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 三.文件与目录的创建以及删除(未完成) 四.垃圾回收机制 五.数据恢复机制 数据恢复的原理以及方式 后滚恢 ...

  8. Android结合源码分析Power按键处理流程

    这是之前团队进行技术交流时,我选择的一个主题,那段时间解决power锁屏按键的bug,搞得头大,所以借此机会结合Android8.0源码去分析Power键的处理流程,也将此分享出来,希望对大家有所帮助 ...

  9. k8s replicaset controller源码分析(1)- 初始化与启动分析

    replicaset controller分析 replicaset controller简介 replicaset controller是kube-controller-manager组件中众多控制 ...

  10. SRS源码分析-rtmp转rtc流程

    前言 SRS4.0支持将RTMP流转换成RTC流,本文将结合源码分析下这个过程. 配置 首先,需要在SRS4.0的启动配置文件里面开启RTC Server和RTC 能力,可以参考官方提供的配置文件./ ...

最新文章

  1. 信息管理代码分析二读取二进制文件数据
  2. 【图像分割模型】实例分割模型—DeepMask
  3. c语言,c++求最大公因数与最小公倍数方法集合
  4. 【Python】学习笔记总结7(简单爬虫)
  5. 前端学习(2521):设定添加博客和最终效果展示
  6. php多个请求只执行一次,php使用redis的blPop/brPop,一台服务器多个并发,也只能一次一次执行?...
  7. 男人这辈子挺难的 ^^^
  8. Django进阶(CSRF、Ajax)
  9. found.000是什么,能删除吗
  10. redis-(error) CLUSTERDOWN Hash slot not served
  11. ps制作公章教程,沿着圆圈打字,斑驳效果
  12. 天梯赛座位 分配分数 20作者 陈越单位 浙江大学
  13. 计算机网络设备的种类,计算机网络设备选型依据.ppt
  14. springCloud框架搭建,添加feign和Zuul
  15. http之短链接原理分析
  16. Python 数据采集-爬取学校官网新闻标题与链接(基础)
  17. 基于matlab的步进电机仿真(一)
  18. Python中的GPS轨迹聚类
  19. tableView 取消 cell 默认下划线样式 - iOS
  20. 各地相继设立交易所,抢滩大数据交易市场

热门文章

  1. 自学前端第一天:认识前端工程与网页
  2. python按照日期筛选excel_【Python代替Excel】6:按条件筛选
  3. [人物] “在人间播种子,在天上洒甘霖。” 国士无双,袁老千古。
  4. 加拿大各省接受公立教育的初始年龄汇总 — 供携子女赴加的访学、博后参考
  5. BOM 和 DOM 的区别是什么?
  6. 小内存堆管理算法详细解析
  7. 华为荣耀X1相机或图库图标被删除后的恢复方法(不需要恢复出厂设置)!
  8. 三十六计第三计 借刀杀人
  9. 巴拿赫空间的基本概念
  10. 自然语言处理(三):传统RNN(NvsN,Nvs1,1vsN,NvsM)pytorch代码解析