該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上那個項目中獲取,下面介紹下基於該插件開發實現自己業務的插件。
- 在eclipse中創建用戶類庫ku,到kettle管理平台項目介紹的博文中下載0.1.0版部署包,然后將部署包的lib目錄中的jar全部加入。
- 在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。以下是該插件配置界面,可以修改步驟名稱,在類名稱處填寫你的實現類的完整類路徑,然后就可以點擊【獲取默認配置】按鈕,獲取你配置的實現類對應的配置信息,根據需要修改即可完成配置。以下分別是轉換的插件實現示例和作業實體實現示例截圖。
以上就完成了基於該插件的開發使用工作,由上可以看出,執行編寫一個類,就可以完成一個插件的開發工作。