kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

 

新版长期维护文档

 

      该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义功能的实现改为在eclipse等ide中开发。

      设计本插件的原因是直接在kettle中写java代码是很不容易的事,开发体验与eclipse差得远,java语法还要受到限制,调试麻烦。实现点简单的逻辑还行,稍微复杂一点就比较麻烦,需要对java和kettle相关接口很熟悉。而简单的功能可以采用javascript脚本实现,复杂的功能一般人很难直接在自定义java类控件中编写java实现。

      有人说可以每次直接开发新插件,虽然说java的插件机制还是很不错的,但开发一个插件还是没那么容易的,需要设计元数据,插件件功能实现,插件操作界面设计等,其中操作界面的调整是我最不愿意花时间的,慢慢调我也能调出常见控件的配置界面,但我觉得没必要,所以要实现一个完善的插件需要做的事情还是很多的。

      而本插件综合了以上两种机制,既有自定义java类的简单性,直接编写核心业务代码,操作界面统一使用一个JSON对象作为参数设置途径,所以基于此开发功能,只需继承一个基类而编写一个功能实现类就可以了;又有直接开发插件的便捷性,只需将相关的jar包作为用户类库导入项目,创建一个类,继承基类,就可以在eclipse中尽情的编写你的业务代码了。

      该插件已经作为我的另一个开源项目kettle管理平台(http://www.cnblogs.com/majinju/p/5739820.html)的一个子项目开源,相关代码可以从github上那个项目中获取,下面介绍下基于该插件开发实现自己业务的插件。

  1. 在eclipse中创建用户类库ku,到kettle管理平台项目介绍的博文中下载0.1.0版部署包,然后将部署包的lib目录中的jar全部加入。
  2. 在eclipse中创建一个java项目,添加上一步创建的用户类库到构建路径,然后新建一个java类,以下是转换步骤实现代码样例。
/**
* Project Name:KettleUtil
* Date:2016年6月29日
* Copyright (c) 2016, jingma All Rights Reserved.
*/

package net.oschina.kettleutil.utilrun;

import net.oschina.kettleutil.KettleUtilRunBase;
import net.oschina.mytuils.KettleUtils;

import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMeta;
import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.StepMeta;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * kettle util 运行示例<br/>
 * date: 2016年6月29日 <br/>
 * @author jingma
 * @version 
 */
public class KurDemo extends KettleUtilRunBase{
    /**
    * 具体处理每一行数据
    * @see net.oschina.kettleutil.KettleUtilRunBase#disposeRow(java.lang.Object[])
    */
    @Override
    protected void disposeRow(Object[] outputRow) {
        //设置JOB名称
        outputRow[getFieldIndex("JOB_NAME")] = KettleUtils.getRootJobName(ku);
    }
    /**
    * 
    * @see net.oschina.kettleutil.KettleUtilRunBase#init()
    */
    @Override
    protected void init() {
        ku.logBasic("初始化插件");
    }
    /**
    * 
    * @see net.oschina.kettleutil.KettleUtilRunBase#end()
    */
    @Override
    protected void end() {
        ku.logBasic("数据处理结束");
    }

    /**
     * 
     * @see net.oschina.kettleutil.KettleUtilRunBase#getDefaultConfigInfo(org.pentaho.di.trans.TransMeta, java.lang.String)
     */
     @Override
     public String getDefaultConfigInfo(TransMeta transMeta, String stepName) throws Exception{
        //创建一个JSON对象,用于构建配置对象,避免直接拼字符串构建JSON字符串
        JSONObject params = new JSONObject();
        //设置一个参数key1
        params.put("key1", "");
        RowMetaInterface fields = transMeta.getPrevStepFields(stepName);
        if(fields.size()==0){
            throw new RuntimeException("没有获取到上一步骤的字段,请确认连接好上一步骤");
        }
        params.put("PrevInfoFields", fields.toString());
        //创建一个JSON数组对象,用于存放数组参数
        JSONArray arr = new JSONArray();
        arr.add("arr1");
        arr.add("arr2");
        params.put("array", arr);
        //生成的参数样例
        //{
        //  "array":[
        //          "arr1",
        //          "arr2"
        //  ],
        //  "key1":""
        //}
        //返回格式化后的默认JSON配置参数,供使用者方便快捷的修改配置
        return JSON.toJSONString(params, true);
    }
    
    public void getFields(RowMetaInterface r, String origin, RowMetaInterface[] info, StepMeta nextStep, VariableSpace space) {
        //添加输出到下一步的字段
        addField(r,"JOB_NAME",ValueMeta.TYPE_STRING,ValueMeta.TRIM_TYPE_BOTH,origin,"JOB名称");
    }
}

  3. 以下是作业实体插件实现样例

/**
* Project Name:KettleUtil
* Date:2016年6月29日
* Copyright (c) 2016, jingma All Rights Reserved.
*/

package net.oschina.kettleutil.utilrun;

import net.oschina.kettleutil.jobentry.JobEntryKettleUtilRunBase;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * job entry kettle util 运行示例<br/>
 * date: 2016年6月29日 <br/>
 * @author jingma
 * @version 
 */
public class JeurDemo extends JobEntryKettleUtilRunBase{

    /**
    * 
    * @see net.oschina.kettleutil.jobentry.JobEntryKettleUtilRunBase#run()
    */
    @Override
    protected boolean run() throws Exception {
        //这里写自己的业务
        jeku.logBasic(jeku.getConfigInfo());
        jeku.logBasic(configInfo.toJSONString());
        return true;
    }

    /**
     * 
     * @see net.oschina.kettleutil.KettleUtilRunBase#getDefaultConfigInfo(org.pentaho.di.trans.TransMeta, java.lang.String)
     */
     @Override
     public String getDefaultConfigInfo() throws Exception{
        //创建一个JSON对象,用于构建配置对象,避免直接拼字符串构建JSON字符串
        JSONObject params = new JSONObject();
        //设置一个参数key1
        params.put("key1", "");
        //创建一个JSON数组对象,用于存放数组参数
        JSONArray arr = new JSONArray();
        arr.add("arr1");
        arr.add("arr2");
        params.put("array", arr);
        //生成的参数样例
        //{
        //  "array":[
        //          "arr1",
        //          "arr2"
        //  ],
        //  "key1":""
        //}
        //返回格式化后的默认JSON配置参数,供使用者方便快捷的修改配置
        return JSON.toJSONString(params, true);
//         return "select *\n from dual";
    }
}

     4. 开发完成后,打包放入kettle lib中,重启kettle。以下是该插件配置界面,可以修改步骤名称,在类名称处填写你的实现类的完整类路径,然后就可以点击【获取默认配置】按钮,获取你配置的实现类对应的配置信息,根据需要修改即可完成配置。以下分别是转换的插件实现示例和作业实体实现示例截图。

  以上就完成了基于该插件的开发使用工作,由上可以看出,执行编写一个类,就可以完成一个插件的开发工作。

posted @ 2016-08-15 08:56  马进举  阅读(13135)  评论(0编辑  收藏  举报