首先是 自定义组件的demo代码,可以从 下载地址 ,选择自己对应版本,进去后选择 plugins 文件夹, 然后选择zip包下载
下载完成后,我用的idea 打开的,打开后可以看到四个类
DemoStep,DemoStepData,DemoStepDialog,DemoStepMeta
四个类的功能以我自己理解大概说下,
首先是
DemoStepDialog 控制打开组件的布局样式,可以认为这个是前端,页面调试的。
DemoStepMeta 主要用来和DemoStepDialog 类一起用的,页面组件传值,我们要把它们分别存下来,就要靠这个类,同时这个类还有个至关重要的功能就是往后面传数据,这个后面我们单独讲。
DemoStep 这个就是业务逻辑类,主要的业务逻辑就是靠这个类。
DemoStepData 配合DemoStep 使用,取前后环境参数、系统参数使用。
我首先说下 我开发这个时候过程哈。
举个例子比如我想要连接一张表,并且需要获得到这张表的字段。
我是一个个打开系统自带组件,找类似的功能,这不,在 “插入/更新” 组件找到这个,我就去看这个组件的源码,把上述我说的四个类打开,最终实现自己想要的功能。
因为内网的原因,无法把代码贴图出来…
这里我就说几个注意点,
- *****Dialog 类,这个要多尝试获取才能适配到自己内心布局,毕竟SWT不是主流,大部分人还是不精通。 最好的就是找个系统自带的组件,复制源码,然后基于源码改,是最简单的。
- *****Meta 类 上面有注解,其中id 是唯一的,不能重复,categoryDescription是控制这个组件在kettle文件显示位置(输入,输出,转换?)。
我们说下这个类的方法,getXml,loadXml,saveRep,readRep这四个可以直接参考系统组件源码对应的改,没啥说的,很简单。只要是getFields这个就是上面说,控制往后面组件传数据,需要 new一个ValueMetaString对象,一个对象代表一列。
注意点:如果你使用了数据库组件,这个类要重写一个getUserDatabaseConnections方法,只有重写了这个方法,你将这个ktr发给别人,别人运行的话才能回显你配置的数据库连接,要不然别人打开的话,数据库是空的。 - DemoStep也说两个注意点,一个是获取命令行参数的问题,因为页面可以通过配置${**}获取参数值,实现灵活配置,通过environmentSubsrttute("配置参数名 ")获取。
第二个是给后面数据传结果的问题,有的组件就是单纯的转换,不需要传结果,只需要init方法 中 加上super.init(smi,sdi)判断。然后返回true,再在processRow方法里面加上setOutputDone(); return false;既可不结果给后面参数,
需要要传参数,init方法不变,在processRow中首先要掉Meta的getFields方法,然后在putRow(Object[]);Object[]是已经拼装好的返回数组, 如果有多行的话,你就返回true,他会再次执行DemoStep的processRow方法,直到你返回false为止。
插件集成
在kettle 安装目录的 plugins文件下新建my-step-plugin文件夹,并将kettle-sdk-step-plugin-**.jar复制到文件夹下。
启动spoon.bat 就能在转换中看到对应的demo step
远程调试
改Spoon.bat脚本,在if “%PENTAHO_DI_JAVA_OPTIONS%”==“” set PENTAHO_DI_JAVA_OPTIONS=“-Xms1024m” “-Xmx2048m” “-XX:MaxPermSize=256m” 后面增加一行debug信息 -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888
重新启动kettle,在idea中新建remote ,并修改port为刚才spoon.bat中增加的端口,这里是10001
运行idea的debug,在相应的代码上打断点,kettle中运行这个转换,就会进入到我们的断点中,可以进行远程调试了。
最后再加个 用命令行执行ktr文件,并带命令行参数 首先找到kettle客户端文件夹下的Pan文件,
执行命令:****\pan /file 执行的ktr路径.ktr “/param:参数名A=“参数值A”” “/param:参数名B=“参数值B””
我个人觉得 自定义组件最好的学习办法就是看系统组件的源码,然后一遍遍尝试,终能成功!