kettle源码分析含笔记Word文档格式.docx
- 文档编号:19502233
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:36
- 大小:1.14MB
kettle源码分析含笔记Word文档格式.docx
《kettle源码分析含笔记Word文档格式.docx》由会员分享,可在线阅读,更多相关《kettle源码分析含笔记Word文档格式.docx(36页珍藏版)》请在冰豆网上搜索。
org.pentaho.di.ui.spoonà
Spoon.java,RunAsà
javaapplication
二.源码分析
2.1.修改kettle界面
修改初始化界面
打开packageorg.pentaho.di.ui.spoon的Spoon.Java,找到main函数,该main函数为Spoon工具的入口,找到如下语句
Splashsplash=newSplash(display);
该语句为spoon初始化显示的界面,跳到定义Splash.java,下面函数
canvas.addPaintListener(newPaintListener(){
publicvoidpaintControl(PaintEvente){
StringversionText=BaseMessages.getString(PKG,"
SplashDialog.Version"
)+"
"
+Const.VERSION;
//$NON-NLS-1$//$NON-NLS-2$
StringBuildersb=newStringBuilder();
Stringline=null;
try{
BufferedReaderreader=newBufferedReader(newInputStreamReader(Splash.class.getClassLoader().getResourceAsStream("
org/pentaho/di/ui/core/dialog/license/license.txt"
)));
//$NON-NLS-1$
while((line=reader.readLine())!
=null){
sb.append(line+System.getProperty("
line.separator"
));
}
}catch(Exceptionex){
sb.append("
"
);
Log.warn(BaseMessages.getString(PKG,"
SplashDialog.LicenseTextNotFound"
StringlicenseText=sb.toString();
e.gc.drawImage(kettle_image,0,0);
//IfthisisaMilestoneorRCrelease,warntheuser
if(Const.RELEASE.equals(Const.ReleaseType.MILESTONE)){
versionText=BaseMessages.getString(PKG,"
SplashDialog.DeveloperRelease"
-"
+versionText;
drawVersionWarning(e);
}elseif(Const.RELEASE.equals(Const.ReleaseType.RELEASE_CANDIDATE)){
SplashDialog.ReleaseCandidate"
//$NON-NLS-1$//$NON-NLS-2$
elseif(Const.RELEASE.equals(Const.ReleaseType.PREVIEW)){
SplashDialog.PreviewRelease"
elseif(Const.RELEASE.equals(Const.ReleaseType.GA)){
SplashDialog.GA"
FontverFont=newFont(e.display,"
Helvetica"
11,SWT.BOLD);
e.gc.setFont(verFont);
e.gc.drawText(versionText,290,205,true);
//tryusingthedesiredfontsizeforthelicensetext
intfontSize=8;
FontlicFont=newFont(e.display,"
fontSize,SWT.NORMAL);
e.gc.setFont(licFont);
//ifthetextwillnotfittheallowedspace
while(!
willLicenseTextFit(licenseText,e.gc)){
fontSize--;
licFont=newFont(e.display,"
e.gc.drawText(licenseText,290,290,true);
});
1.修改背景图片
找到ui/image/下面的kettle_splash.png,替换该图片
2.修改版本信息
找到e.gc.drawText(versionText,290,205,true);
改为e.gc.drawText("
海康威视数据交换平台V1.0"
290,205,true);
3.修改下面的描述性文字
找到e.gc.drawText(licenseText,290,290,true);
改为e.gc.drawText("
作者:
海康"
290,290,true);
4.预览效果
修改spoon主界面标题
找到spoon.java下面的
publicstaticfinalStringAPP_NAME=BaseMessages.getString(PKG,"
Spoon.Application.Name"
修改为要改成的标题
修改spoon界面主菜单栏
Ui/spoon.xul下引用menubar.xul代码,
<
pen:
includesrc="
menubar.xul"
ignoreroot="
true"
/>
menubar.xul为主菜单栏的配置处
修改spoon菜单栏
Spoon菜单栏
配置的地方在spoon.xul下的
menupopupid="
new-file-popup"
>
<
menuitemlabel="
${Spoon.Menubar.File.NewJob}"
command="
spoon.newJobFile()"
image="
${ChefIcon_image}"
menuitemid="
menubar-new-trans"
label="
${Spoon.Menubar.File.NewTrans}"
spoon.newTransFile()"
${SpoonIcon_image}"
menuseparator/>
${Spoon.Menubar.File.NewDatabaseConn}"
spoon.newConnection()"
${CNC_image}"
${Spoon.Menubar.File.NewSlave}"
spoon.newSlaveServer()"
${Slave_image}"
/menupopup>
修改转换和job插件列表及图标
Src/kettle-steps.xml是旁边转换插件列表的配置文件处
文件分析如下,这个为表输入的配置
stepid="
TableInput"
description>
i18n:
org.pentaho.di.trans.step:
BaseStep.TypeLongDesc.TableInput<
/description>
<
classname>
org.pentaho.di.trans.steps.tableinput.TableInputMeta<
/classname>
category>
BaseStep.Category.Input<
/category>
tooltip>
BaseStep.TypeTooltipDesc.TableInput<
/tooltip>
iconfile>
ui/images/TIP.png<
/iconfile>
/step>
classname为对应的源文件,category为属于哪个分类下,例如tableinput属于“输入”组,tooltip提示信息,iconfile显示图片
主面板布局
在spoon.java下的privatevoidaddTree()方法内
2.2.Kettle数据转换流程
Kettle数据转换流程是一个生产者消费者模型,每个步骤为一个节点,每个节点是一个单独的线程,节点和节点之间通过一个阻塞队列传递数据,前一个节点一条一条的往阻塞队列写入,后面节点一条一条的从阻塞队列读取,阻塞队列实现方法在src-core/org/pentaho/di/core/BlockingRowSet.java。
表输入流程
表输入通过JDBC连接数据库,执行SQL语句后返回一个ResultSet(结果集),如果数据库支持PreparedStatement.setFetchSize(每次返回的多少条记录到结果集),分批将数据返回到结果集中,然后逐条从结果集中读取数据写入到阻塞队列中;
如果不支持分批次读取,则一次行将数据返回到ResultSet中,然后逐条读取写入阻塞队列,数据库的操作的方法在src-db/org/pentaho/di/core/database/Database.java中实现。
插入更新流程
2.3.插件研究
kettle转换步骤工作组件
这里有四个类构成了这个kettle步骤/节点,每一个类都有其特定的目的及所扮演的角色。
TemplateStep:
步骤类实现了StepInteface接口,在转换运行时,它的实例将是数据实际处理的位置。
每一个执行线程都表示一个此类的实例。
TemplateStepData:
数据类用来存储数据,当插件执行时,对于每个执行的线程都是唯一的。
执行时里面存储的东西主要包括数据库连接、文件句柄、缓存等等其他东西。
TemplateStepMeta:
元数据类实现了StepMetaInterface接口。
它的职责是保存和序列化特定步骤实例的配置,在我们这个例子中,它负责保存用户设置的步骤名称和输出字段的名称。
TemplateStepDialog:
对话框类实现了该步骤与用户交互的界面,它显示一对话框,通过对话框用户可以自己的喜好设定步骤的操作。
对话框类与元数据类关系非常紧密,元数据类可以追踪用户的设置。
除了上面的代码,还有一个plugin.xml,它设置好了插件的元数据,定义了步骤在kettle图形工作台中的显示效果。
为了更好的让大家理解,我将利用这个步骤设计一个转换流程并执行它。
对于插件的开发,我们将从plugin.xml配置文件开始讲起,然后讲讲元数据和对话框类,最后再讲讲步骤类和数据类。
书写你自己的plugin.xml:
下面plugin.xml是我们这个插件里面的内容,它的功能是告诉kettle插件的元数据类,插件的名称及描叙,还有需要加载的jar包。
想要了解细节,可以查看文章:
plug-inloading
?
xmlversion="
1.0"
encoding="
UTF-8"
plugin
id="
TemplatePlugin"
iconfile="
icon.png"
description="
TemplatePlugin"
tooltip="
Onlytherefordemonstrationpurposes"
category="
Demonstration"
classname="
plugin.template.TemplateStepMeta"
libraries>
libraryname="
templatestep.jar"
/libraries>
/plugin>
ID:
在kettle插件中必须全局唯一,因为被kettle序列化了,所以不要随便改变
Iconfile:
kettle中插件显示的图片,必须是png图片
Description:
插件描叙,显示在树形菜单里面。
Tooltip:
树形菜单中,鼠标滑过的时候显示的提示信息
Category:
插件显示的父目录
Classname:
元数据类
Library:
指明了插件需要加载所依赖的jar包
插件主要包含类介绍
一、元数据类:
下面显示了元数据的几个关键的方法,注意元数据类里面用私有成员变量outputField存储了下一个步骤的输出字段。
//keeptrackofthestepsettings
publicStringgetOutputField()
publicvoidsetOutputField(…)
publicvoidsetDefault()
//serializethestepsettingstoandfromxml
publicStringgetXML()
publicvoidloadXML(…)
//serializethestepsettingstoandfromakettlerepository
publicvoidreadRep(…)
publicvoidsaveRep(…)
//provideinformationabouthowthestepaffectsthefieldstructureofprocessedrows
publicvoidgetFields(…)
//performextendedvalidationchecksforthestep
publicvoidcheck(…)
//provideinstancesofthestep,dataanddialogclassestoKettle
publicStepInterfacegetStep(…)
publicStepDataInterfacegetStepData()
publicStepDialogInterfacegetDialog(…)
TemplateStepMeta元数据类其实还有很多方面,不过大多被他的父类BaseStepMeta给默认实现了,这些默认的实现足以使我们的元数据类工作良好。
想要了解更多,大家可以查查关于StepMetaInteface和BaseStepMeta的kettle官方文档。
二、对话框类:
TemeplateStepDialog为步骤实现了对话框的设置,kettle的用户界面部件是使用的eclipse的swt框架,如果要开发比较复杂的对话框,你还必须熟悉大部分swt代码。
Swt文档大家可以从eclipse上的帮助菜单点击在线获取。
在开发过程中,一个对话框对象拥有一个元数据对象,它记录了应该从哪里读取配置?
应该把设置好的配置保存在哪里?
它仅仅设置了输出字段的名称在我们这个模板步骤里面。
一个继承自BaseStepDialog特定的对话框类必须提供open(…)方法,这个方法必须返回这个步骤的名称(发生改变时)或NULL(对话框被取消时)
三、步骤类:
步骤类是实际的处理和转换工作的地方。
因为大部分样本代码已经由父类BaseStep提供了,大多数插件仅仅关注下面几个特定的方法就行。
//initializationandteardown
publicboolean
init(…)
publicvoid
dispose(..)
//processingrows
run()
processRow(..)
Init()方法在转换执行前被kettle调用,转换必须在所有步骤初始化成功时才真正执行。
我们这个模板步骤没有做任何事情,这里仅仅是拿出来让大家了解了解。
dispose()方法是在步骤执行完之后执行(非转换执行完哈),它完成资源的关闭,像文件句柄、缓存等等。
run()方法在实际处理记录集的时候调用。
里面其实是个调用processRow()方法处理记录的小循环,当此步骤再没有数据处理或转换被停止时退出循环。
processRow()方法在处理单条记录的时候被调用。
这个方法通常通过调用getRow()来获取需要处理的单条记录。
这个方法如果有需要将会被阻塞,例如当此步骤希望放慢脚步处理数据时。
processRow()随后的流程将执行转换工作并调用putRow()方法将处理过的记录放到它的下游步骤。
注意:
你的步骤可能会变记录的结构,为了安全起见,一定要多熟悉包org.pentaho.di.core.row,特别是类RowMetaInterface和RowDataUtil。
基类BaseStep对处理的记录提供了第一次访问的标识,在某些代码只执行一次的时候可能非常有用,例如某个费时的查找,其实这就是缓存。
四、数据类:
大多数步骤都需要临时的缓冲或者临时的数据。
数据类就是这些数据合适的存放位置。
每一个执行线程将得到其拥有的数据类实例,所以它能在独立的空间里面运行。
TemplateStepData继承自BaseStepData,作为一个经验法则,不要将non-constant字段放置BaseStepData类里面,如果你必须,请将它最好放置TemplateStepData数据类里面.
我们的步骤仅仅使用了一个数据对象来存储记录集输出的结构,没有用到其他的存储介质,例如文件等等。
开发插件实例
1.在kettle-steps.xml下添加如下节点
MyTest"
MyTest<
mytest.MyTestMeta<
插件测试<
测试<
2.创建插件类
MyTest类代码
packagemytest;
importorg.pentaho.di.trans.Trans;
importorg.pentaho.di.trans.TransMeta;
importorg.pentaho.di.trans.step.BaseStep;
importorg.pentaho.di.trans.step.StepDataInterface;
importorg.pentaho.di.trans.step.StepInterface;
importorg.pentaho.di.trans.step.StepMeta;
publicclassMyTestextendsBaseStepimplementsStepInterface{
publicMyTest(StepMetastepMeta,StepDataInterfacestepDataInterface,
intcopyNr,TransMetatransMeta,Transtrans){
super(stepMeta,stepDataInterface,copyNr,transMeta,trans);
//TODOAuto-generatedconstructorstub
}
MyTestData类代码
importorg.pentaho.di.trans.step.BaseStepData;
publicclassMyTestDat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- kettle 源码 分析 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)