Kettle转换中的转换中的Java代码步骤应用入门与实战代码步骤应用入门与实战
一、问题背景
在使用Kettle的过程中,有可能遇到现有步骤无法满足需求的情况。解决此类问题,有诸如购买第三方插件、开发插件、自定
义Java类等办法。最后一种办法因其代价小且门槛较低而成为最为常用的定制方法。本文将解释Java代码步骤的原理,并通
过一个实际案例,快速掌握相关入门知识。
二、原理剖析
Java代码步骤,位于Kettle转换的核心对象/脚本类别中,属于典型的需要编程基础才能掌控的步骤类型。而Java代码步骤,
适用于熟悉Java语言的开发人员,用好这个步骤,需要对类、接口、多线程等语言相关知识有所掌握,并且需要对Kettle的基
础框架有所理解。Java语言的基础知识不在本文讨论范围,下面将着重对Kettle框架的核心部分进行解释。
Kettle转换的执行,有以下三个核心的生命周期节点:
1、初始化
Kettle转换在执行前,会有一个各步骤的初始化动作,为步骤执行前的准备工作创造机会。为提高初始化的性能,Kettle为每
个步骤启用一个初始化线程,从而并行完成所有步骤的初始化。初始化的主要内容就是调用一次步骤的以下方法:
public boolean init( StepMetaInterface meta, StepDataInterfacedata)
此方法包含两个参数。其中,meta为元数据,data为数据。如果返回true,那么代表初始化成功,否则代表初始化失败。任何
一个步骤初始化失败,都会导致整个转换停止执行(在停止前,会调用每一个转换的资源释放方法dispose)。
2、执行
执行阶段是每一个步骤实现特定价值的时候。为提高效率,Kettle为每一个步骤单独启动一个工作线程来执行任务。Java程序
员都了解,线程的核心代码是覆盖run方法。为简化起见,我将不重要的代码删除,得到工作线程run方法核心代码:
可以看出,线程一直在执行步骤的processRow方法,直到出现以下情况之一:
· processRow方法返回false
· isStopped方法返回true
· processRow方法执行过程中出现异常,
其中,第一种情况代表工作已经正常完成;第二种情况,代表步骤被强制停止;第三种情况,代表执行过程中出现错
误,Kettle将调用stopAll方法,从而导致整个转换的所有工作线程停止执行。
执行方法的声明如下:
public boolean processRow( StepMetaInterface meta,StepDataInterfacedata ) throws KettleException;
每一个步骤,都会在processRow方法中各显神通。一般的过程是,从输入行集中拿出一行,进行特定处理,然后将新的行放
入输出行集中。从输入行集中取数据可以调用getRow方法。如果getRow方法返回值不为null,则步骤应将该行数据进行处
理,并调用putRow方法将处理结果存入输出行集,然后返回true,以继续为下一行输入数据处理提供机会。如果getRow方法
返回null,代表输入行集已经处理完毕,这时可以调用setOutputDone,标识本步骤执行完毕,并返回false,以结束本工作线
程的执行。
3、资源释放
从上述工作线程的核心代码可以看出,不管工作线程是正常执行完毕还是异常执行完毕,最终会调用dispose方法。该方法声
明如下: