kettle源码分析含笔记Word文档格式.docx

上传人:b****5 文档编号:19502233 上传时间:2023-01-07 格式:DOCX 页数:36 大小:1.14MB
下载 相关 举报
kettle源码分析含笔记Word文档格式.docx_第1页
第1页 / 共36页
kettle源码分析含笔记Word文档格式.docx_第2页
第2页 / 共36页
kettle源码分析含笔记Word文档格式.docx_第3页
第3页 / 共36页
kettle源码分析含笔记Word文档格式.docx_第4页
第4页 / 共36页
kettle源码分析含笔记Word文档格式.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

kettle源码分析含笔记Word文档格式.docx

《kettle源码分析含笔记Word文档格式.docx》由会员分享,可在线阅读,更多相关《kettle源码分析含笔记Word文档格式.docx(36页珍藏版)》请在冰豆网上搜索。

kettle源码分析含笔记Word文档格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1