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。以下是該插件配置界面,可以修改步驟名稱,在類名稱處填寫你的實現類的完整類路徑,然后就可以點擊【獲取默認配置】按鈕,獲取你配置的實現類對應的配置信息,根據需要修改即可完成配置。以下分別是轉換的插件實現示例和作業實體實現示例截圖。

  以上就完成了基於該插件的開發使用工作,由上可以看出,執行編寫一個類,就可以完成一個插件的開發工作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM