kettle系列-2.kettle源码结构分析
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功底的时候了。