网站设计构想,flash网站源码带后台,网站子域名怎么设置,软件开发的一般流程kettle转换步骤工作组件 这里有四个类构成了这个kettle 步骤/节点#xff0c;每一个类都有其特定的目的及所扮演的角色。 TemplateStep: 步骤类实现了StepInteface接口#xff0c;在转换运行时#xff0c;它的实例将是数据实际处理的位置。每一个执行线程都表示一个此类的实…kettle转换步骤工作组件 这里有四个类构成了这个kettle 步骤/节点每一个类都有其特定的目的及所扮演的角色。 TemplateStep: 步骤类实现了StepInteface接口在转换运行时它的实例将是数据实际处理的位置。每一个执行线程都表示一个此类的实例。 TemplateStepData: 数据类用来存储数据当插件执行时对于每个执行的线程都是唯一的。执行时里面存储的东西主要包括数据库连接、文件句柄、缓存等等其他东西。 TemplateStepMeta: 元数据类实现了StepMetaInterface接口。它的职责是保存和序列化特定步骤实例的配置在我们这个例子中它负责保存用户设置的步骤名称和输出字段的名称。 TemplateStepDialog对话框类实现了该步骤与用户交互的界面它显示一对话框通过对话框用户可以自己的喜好设定步骤的操作。对话框类与元数据类关系非常紧密元数据类可以追踪用户的设置。 除了上面的代码还有一个plugin.xml,它设置好了插件的元数据定义了步骤在kettle图形工作台中的显示效果。为了更好的让大家理解我将利用这个步骤设计一个转换流程并执行它。对于插件的开发我们将从plugin.xml配置文件开始讲起然后讲讲元数据和对话框类最后再讲讲步骤类和数据类。 书写你自己的plugin.xml 下面plugin.xml是我们这个插件里面的内容它的功能是告诉kettle插件的元数据类插件的名称及描叙还有需要加载的jar包。想要了解细节可以查看文章plug-in loading ?xml version1.0 encodingUTF-8? plugin idTemplatePlugin iconfileicon.png descriptionTemplate Plugin tooltipOnly there for demonstration purposes categoryDemonstration classnameplugin.template.TemplateStepMeta libraries library nametemplatestep.jar/ /libraries /plugin ID:在kettle插件中必须全局唯一因为被kettle序列化了所以不要随便改变 Iconfile: kettle中插件显示的图片必须是png图片 Description插件描叙显示在树形菜单里面。 Tooltip:树形菜单中鼠标滑过的时候显示的提示信息 Category:插件显示的父目录 Classname元数据类 Library:指明了插件需要加载所依赖的jar包 插件主要包含类介绍 一、元数据类 下面显示了元数据的几个关键的方法,注意元数据类里面用私有成员变量outputField 存储了下一个步骤的输出字段。 // keep track of the step settingspublic String getOutputField()public void setOutputField(…)public void setDefault() // serialize the step settings to and from xmlpublic String getXML()public void loadXML(…) // serialize the step settings to and from a kettle repositorypublic void readRep(…)public void saveRep(…) // provide information about how the step affects the field structure of processed rowspublic void getFields(…) // perform extended validation checks for the steppublic void check(…) // provide instances of the step, data and dialog classes to Kettlepublic StepInterface getStep(…)public StepDataInterface getStepData()public StepDialogInterface getDialog(…) TemplateStepMeta元数据类其实还有很多方面不过大多被他的父类BaseStepMeta给默认实现了这些默认的实现足以使我们的元数据类工作良好。想要了解更多大家可以查查关于StepMetaInteface和BaseStepMeta的kettle官方文档。 二、对话框类 TemeplateStepDialog为步骤实现了对话框的设置kettle的用户界面部件是使用的eclipse的swt框架如果要开发比较复杂的对话框你还必须熟悉大部分swt代码。 Swt文档大家可以从eclipse上的帮助菜单点击在线获取。在开发过程中一个对话框对象拥有一个元数据对象它记录了应该从哪里读取配置应该把设置好的配置保存在哪里它仅仅设置了输出字段的名称在我们这个模板步骤里面。一个继承自BaseStepDialog特定的对话框类必须提供open(…)方法这个方法必须返回这个步骤的名称发生改变时或NULL对话框被取消时 三、步骤类 步骤类是实际的处理和转换工作的地方。因为大部分样本代码已经由父类BaseStep提供了大多数插件仅仅关注下面几个特定的方法就行。 // initialization and teardownpublic boolean init(…)public void dispose(..) // processing rowspublic void run()public boolean 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下添加如下节点 step idMyTest descriptionMyTest/description classnamemytest.MyTestMeta/classname category插件测试/category tooltip测试/tooltip iconfileui/images/TIP.png/iconfile /step 2. 创建插件类 MyTest类代码 package mytest; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.BaseStep; import org.pentaho.di.trans.step.StepDataInterface; import org.pentaho.di.trans.step.StepInterface; import org.pentaho.di.trans.step.StepMeta; publicclass MyTest extends BaseStep implements StepInterface { public MyTest(StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr, TransMeta transMeta, Trans trans) { super(stepMeta, stepDataInterface, copyNr, transMeta, trans); // TODO Auto-generated constructor stub } } MyTestData类代码 package mytest; import org.pentaho.di.trans.step.BaseStepData; import org.pentaho.di.trans.step.StepDataInterface; publicclass MyTestData extends BaseStepData implements StepDataInterface { } MyTestMeta类代码 package mytest; import java.util.List; import java.util.Map; import org.pentaho.di.core.CheckResultInterface; import org.pentaho.di.core.Counter; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.exception.KettleXMLException; import org.pentaho.di.core.row.RowMetaInterface; import org.pentaho.di.repository.ObjectId; import org.pentaho.di.repository.Repository; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.BaseStepMeta; import org.pentaho.di.trans.step.StepDataInterface; import org.pentaho.di.trans.step.StepInterface; import org.pentaho.di.trans.step.StepMeta; import org.pentaho.di.trans.step.StepMetaInterface; import org.w3c.dom.Node; publicclass MyTestMeta extends BaseStepMeta implements StepMetaInterface { public MyTestMeta() { super(); } Override publicvoid setDefault() { // TODO Auto-generated method stub } Override publicvoid loadXML(Node stepnode, ListDatabaseMeta databases, MapString, Counter counters) throws KettleXMLException { // TODO Auto-generated method stub } Override publicvoid saveRep(Repository rep, ObjectId id_transformation, ObjectId id_step) throws KettleException { // TODO Auto-generated method stub } Override publicvoid readRep(Repository rep, ObjectId id_step, ListDatabaseMeta databases, MapString, Counter counters) throws KettleException { // TODO Auto-generated method stub } Override publicvoid check(ListCheckResultInterface remarks, TransMeta transMeta, StepMeta stepMeta, RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info) { // TODO Auto-generated method stub } Override public StepInterface getStep(StepMeta stepMeta, StepDataInterface stepDataInterface, int copyNr, TransMeta transMeta, Trans trans) { // TODO Auto-generated method stub returnnull; } Override public StepDataInterface getStepData() { // TODO Auto-generated method stub returnnull; } } MyTestDialog类代码 package mytest; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.BaseStepMeta; import org.pentaho.di.trans.step.StepDialogInterface; import org.pentaho.di.ui.trans.step.BaseStepDialog; publicclass MyTestDialog extends BaseStepDialog implements StepDialogInterface { public MyTestDialog(Shell parent, Object in, TransMeta transMeta, String stepname) { super(parent, (BaseStepMeta)in, transMeta, stepname); // TODO Auto-generated constructor stub } Override public String open() { Shell parent getParent(); Display display parent.getDisplay(); shell new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN); props.setLook(shell); shell.open(); shell.setSize(200, 200); shell.setText(hello); returnnull; } } 除TestDialog类外的3个类的代码都是在加入继承基类和接口后更加eclipse插件提示自动生成的也是我们自己需要实现的方法TestDialog类中的MyTestDialog方法参数是固定的根据生成的需要修改下open函数是要我们自己实现的运行效果如下 双击MyTest后弹出一个空白的窗口 调用use define java class 插件 以kettle中自带的samples\transformations\User Defined Java Class - Calculate the date of Easter.ktr为例 public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { Object[] rgetRow();//从阻塞队列中获取一个数据对象(一行数据记录) if (rnull)//如果没有可获取的数据代表以处理完成 { setOutputDone();//设置处理完成标志 return false;//退出循环 } if (first) {//第一次进入循环 //初始化动作 firstfalse;//设置为非第一次循环 } /* *处理函数 */ logBasic(r[0].toString());//打印 putRow(data.outputRowMeta, r);//输出到阻塞队列 return true; } use define java class 插件其实就是一个空插件然后我们自己来实现processRow函数体kettle通过while循环来调用processRow函数一行一行的处理数据流程如下所示 来源 http://blog.csdn.net/qq250941970/article/details/7695897 转载于:https://www.cnblogs.com/tuanz/p/8709231.html