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

启动

对于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 method
    startServer(); //启动服务器
    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 password
      Node 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值