kettle是一个开源产品,产品本身设计是很优秀的,代码应该是很多开源爱好者用业余时间贡献的,代码整体结构还是比较容易理解的,但具体到每一个控件内部就因人而异了,感觉还是挺复杂的,肯定别人考虑得比较全面。但因为是开源产品,不像商业产品那样完善,测试、具体代码规范等就没有商业产品严格了,所以bug相对较多什么的都是可以理解的,后面会将我遇到的部分bug及修复方式分享出来。

上一篇文章我们导入了5个项目,是我认为修改使用过程中遇到的bug时可能需要用到的项目,相信通过上一篇文章的介绍很容易就能添加其他模块的代码进来,需要再添加吧。下图是各模块的简介:

我修改过代码的就只有engine和ui,我遇到的bug基本都是在这两个层面上的,core里面的database倒是也看了一下。除了代码,还需要了解package-res/ui这个文件夹里的内容,这里面的xul文件就是界面布局的xml,菜单层次、对应的i18n键、菜单对应代码中哪个方法等都在这里面配置的。里面的images就是图标了,你可以替换为你喜欢的图标,ui里面有多个布局文件,想了解单击了界面某个菜单具体的代码实现时就到这里面找,根据需要看吧,ui文件夹内容如:

玩kettle主要就是创建作业(job)和转换(transition),作业和转换有着各自不同的控件,作业的特点是依次运行作业中的各个控件,而转换是多线程同时运行转换中的各个控件,转换就像工厂流水线,很多工人同时都在工作,一件产品经一个工人处理后转交给下一个工人,然后这个工人继续处理下一产品,产品就是我们的数据流,一条一条的数据记录,如excel中的数据入到数据库中,我们需要excel输入和表输出两个转换控件,这就是流水线上的两个工人,excel输入读取excel文件,依次读取里面的数据行,一行一行的将excel中的数据传给表输出控件,表输出控件这个工人同时也在工作,一旦excel输入传来数据,他马上就开始往数据库中写。而作业就没有数据流的概念,不会源源不断的接收上一个作业控件传来的数据,如我们从ftp上下载文件然后通过一个转换处理下载下来的文件,需要先把文件下载完成才能开始后续处理工作,不能边下载边处理,所以ftp下载和转换都是作业控件。所有作业控件和转换控件才是我们要研究的主角,玩kettle基本都是和他们打交道。

每个控件又分为某一项技能和某一个人,一个人拥有某项技能以后就是我们的一个控件了,我们可以对每个控件进行各项设置,就像可以告诉这个人今天具体做什么工作,我们可以同时拖多个相同类型的控件,就像可以有多个人拥有相同的技能。类似的就是ftp下载作业控件和excel输入转换控件,后面会以这两个控件为例子介绍作业控件和转换控件。每个控件对应的技能的实现就在engine项目中,人的实现ui项目中。

如下就是FTP下载控件的技能实现,每个作业控件都能在engine项目的org.pentaho.di.job.entries包下面找到技能实现,类似的转换控件能在engine项目的org.pentaho.di.trans.steps包下面找到技能实现,job运行起来具体怎么处理数据的就能在这里看到。

如下是FTP下载控件的ui层实现,主要用于配置控件参数,每个作业控件都能在ui项目的org.pentaho.di.ui.job.entries包下找到ui层实现,类似的转换控件也能在ui项目的org.pentaho.di.ui.trans.steps包下找到ui层实现。

通过上面的介绍我们可以知道,在界面配置有问题在ui项目看实现,运行中出错,找问题在engine项目中找。作业控件一般属性和业务逻辑都在一个类中,转换控件一般会分为*Data、*Meta和一个业务实现类、若干相关工具类。Data用于保存运行数据,Meta用于保存配置元数据,有与资源库交互的实现。

源码分析差不多就到这里了,有问题能快速定位到具体代码,然后就是考验java功底的时候了。

kettle系列-2.kettle源码结构分析的更多相关文章

  1. SequoiaDB 系列之七 :源码分析之catalog节点

    这一篇紧接着上一篇SequoiaDB 系列之六 :源码分析之coord节点来讲 在上一篇中,分析了coord转发数据包到catalog节点(也有可能是data节点,视情况而定).这一次,我们继续分析上 ...

  2. SequoiaDB 系列之六 :源码分析之coord节点

    好久不见. 在上一篇SequoiaDB 系列之五   :源码分析之main函数,有讲述进程开始运行时,会根据自身的角色,来初始化不同的CB(控制块,control block). 在之前的一篇Sequ ...

  3. java多线程系列(九)---ArrayBlockingQueue源码分析

    java多线程系列(九)---ArrayBlockingQueue源码分析 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 j ...

  4. Java集合系列[4]----LinkedHashMap源码分析

    这篇文章我们开始分析LinkedHashMap的源码,LinkedHashMap继承了HashMap,也就是说LinkedHashMap是在HashMap的基础上扩展而来的,因此在看LinkedHas ...

  5. Java并发系列[2]----AbstractQueuedSynchronizer源码分析之独占模式

    在上一篇<Java并发系列[1]----AbstractQueuedSynchronizer源码分析之概要分析>中我们介绍了AbstractQueuedSynchronizer基本的一些概 ...

  6. Java并发系列[3]----AbstractQueuedSynchronizer源码分析之共享模式

    通过上一篇的分析,我们知道了独占模式获取锁有三种方式,分别是不响应线程中断获取,响应线程中断获取,设置超时时间获取.在共享模式下获取锁的方式也是这三种,而且基本上都是大同小异,我们搞清楚了一种就能很快 ...

  7. Java并发系列[5]----ReentrantLock源码分析

    在Java5.0之前,协调对共享对象的访问可以使用的机制只有synchronized和volatile.我们知道synchronized关键字实现了内置锁,而volatile关键字保证了多线程的内存可 ...

  8. 【java集合框架源码剖析系列】java源码剖析之TreeSet

    本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...

  9. 【java集合框架源码剖析系列】java源码剖析之HashSet

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于HashSet的知识. 一HashSet的定义: public class HashSet&l ...

  10. Mybatis 系列10-结合源码解析mybatis 的执行流程

    [Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...

随机推荐

  1. python re 模块和基础正则表达式

    1.迭代器:对象在其内部实现了iter(),__iter__()方法,可以用next方法实现自我遍历. 二.python正则表达式 1.python通过re模块支持正则表达式 2.查看当前系统有哪些p ...

  2. 关于Deprecated: mysql_result: The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

    require_once('connect.php'); $sql = "select * from introduce"; \(query = mysql_query(\)sql ...

  3. 关于redis的keys命令的性能问题

    KEYS pattern 查找所有符合给定模式 pattern 的 key . KEYS * 匹配数据库中所有 key . KEYS h?llo 匹配 hello , hallo 和 hxllo 等. ...

  4. php以pdo方式连接sqlserver,无法开启sqlsrv扩展

    首先,PHP连接sqlserver代码如下: $host="aaaaa"; $dbname="aaaaa"; $user="aaaaa"; ...

  5. Day2-python基础2

    本次学习内容 1.for循环 2.continue and break 3.while循环 4.运算符 5.数据类型 数字 字符串 列表 1.for循环 猜年龄的游戏完善下,只有三次机会 for i ...

  6. js整数补零

    /* * * 整数前面补零 * * 质朴长存法 * num 要补灵的整数 * n个数,比整数位数多前面自动补零 * **/ function pad(num, n) { var len = num.t ...

  7. 静态关键字static(2)

    static关键字主要有两种作用: 第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 具体而言,在Java语言中,static ...

  8. .Net 中的反射(序章) - Part.1

    引言 反射是.Net提供给我们的一件强力武器,尽管大多数情况下我们不常用到反射,尽管我们可能也不需要精通它,但对反射的使用作以初步了解在日后的开发中或许会有所帮助. 反射是一个庞大的话题,牵扯到的知识 ...

  9. Like与Instr模糊查询性能

    项目中用到like模糊查询,但是总觉的太小家子气,有没有高逼格的呢? instr(title,'手册')>0 相当于 title like '%手册%' instr(title,'手册')=1 ...

  10. [解决WebClient或HttpWebRequest首次连接缓慢问题]

    [编程环境]Visual Studio 2010, NET4.0 [开发语言]C#, 理论上VB.NET等依赖.NET Framework框架的语言均受此影响 [问题描述] 使用HttpWebRequ ...