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上那个项目中获取,下面介绍下基于该插件开发实现自己业务的插件。
- 在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。以下是该插件配置界面,可以修改步骤名称,在类名称处填写你的实现类的完整类路径,然后就可以点击【获取默认配置】按钮,获取你配置的实现类对应的配置信息,根据需要修改即可完成配置。以下分别是转换的插件实现示例和作业实体实现示例截图。
以上就完成了基于该插件的开发使用工作,由上可以看出,执行编写一个类,就可以完成一个插件的开发工作。
kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件的更多相关文章
- C#控件系列--文本类控件
C#控件系列--文本类控件 文本类控件主要包含Label.LinkLabel.Button.TextBox以及RichTextBox. Label 功能 Label用来 ...
- js上传插件uploadify自动检测不到flash控件的问题
[问题描述] 项目开发中,由于使用了js的一个上传插件uploadify,下载的是flash版本的,后来在谷歌浏览器上运行时经常报flash控件未安装,虽然下图是uploadify自动检测自动弹出来的 ...
- RadioGroup实现类似ios的分段选择(UISegmentedControl)控件
在ios7中有一种扁平风格的控件叫做分段选择控件UISegmentedControl,控件分为一排,横放着几个被简单线条隔开的按钮,每次点击只能选择其中一个按钮,他类似于tabbar但是又稍微有点区别 ...
- CAD控件,CAD插件使用教程:Android开发使用控件--开发环境的搭建
Android开发使用控件入门--环境搭建 2014-12-24 09:57 14人阅读 评论(0) 收藏 编辑 删除 CAD控件.CAD三维控件,手机 ...
- vue自定义日期选择,类似美团日期选择,日历控件,vue日历区间选择
一个日历的控件,基于vue的,可以日历区间选择,可用于酒店日历区间筛选,动手能力强,可以修改成小程序版本的,先上效果图 里面的颜色样式都是可以修改的 选择范围效果 话不多说,直接上干货,代码可以直接复 ...
- Kettle系列文章二(安装配置Kettle+SqlServer+简单的输入输出作业)
一.下载 Kettle下载地址:https://community.hitachivantara.com/docs/DOC-1009855 下拉到DownLoad,点击红框中的链接进行下载.. 二.解 ...
- cas sso单点登录系列3_cas-server端配置认证方式实践(数据源+自定义java类认证)
转:http://blog.csdn.net/ae6623/article/details/8851801 本篇将讲解cas-server端的认证方式 1.最简单的认证,用户名和密码一致就登录成功 2 ...
- Delphi 制作自定义数据感知控件并装入包(dpk文件)中(与DBText类似的数据感知控件)
一.基础知识简介: 1.包的命名介绍: 包的命名没有规则,但是建议遵守包的命名约定:包的命名与包的版本相关,包的名称前面几个字符通常表示作者或公司名,也可以是控件的一个描述词,后面紧跟的Std表示运行 ...
- 类似web风格的 Winform 分页控件
背景 最近做一个Winform的小程序,需要用到分页,由于之前一直在用 TonyPagerForWinForm.dll ,但该库没有源代码,网上找的也不全面,索性就准备自己改造一个.在园子里翻了一下, ...
随机推荐
- EntityFramework错误:Unable to update the EntitySet because it has a DefiningQuery
错误截图: 解决方法: 在所操作的数据库表中添加一个主键即可解决此问题
- 关于BFC的初步了解以及常见使用
在学习CSS的过程中,掌握一些常用方法或效果实现的原理对于我们的学习来说是很有帮助的.如最常见的清除浮动和取消外边距塌陷时使用overflow:hidden;,在学习初期往往只知道有这种用法,且使用时 ...
- Salesforce ADM201备考心得
Salesforce拥有很多针对不同角色的认证考试.ADM201是面对初级管理员的认证. 考试形式是单选题和多选题(如果是多选题,题干上会提示你要多选),两个小时时间,60道题目.内容涉及管理Sale ...
- c语言一些知识点的记录
1.extern关键字 extern关键字可以置于变量或者函数前面,用于告诉编译器此变量或函数定义于其他的模块.
- Bubble Cup 8 finals E. Spectator Riots (575E)
题意: 一个长宽是100000单位的球场上有很多暴动的观众,每个观众都有一个速度v, 在一秒内,观众会等概率地移动到与原位置的曼哈顿距离<=v的地方(不会移动到界外). 你需要选取三个位置,这三 ...
- ORACLE常用数值函数、转换函数、字符串函数
本文更多将会介绍三思在日常中经常会用到的,或者虽然很少用到,但是感觉挺有意思的一些函数.分二类介绍,分别是: 著名函数篇 -经常用到的函数 非著名函数篇-即虽然很少用到,但某些情况下却很实用 注:N表 ...
- [Machine Learning & Algorithm] 神经网络基础
目前,深度学习(Deep Learning,简称DL)在算法领域可谓是大红大紫,现在不只是互联网.人工智能,生活中的各大领域都能反映出深度学习引领的巨大变革.要学习深度学习,那么首先要熟悉神经网络(N ...
- 关于JavaScript设计模式(一)
以后都在简书写文章了,所以这个转载我在简书中写的.地址这里 http://www.jianshu.com/p/c7b3c2c148c5
- VSTO PowerPoint 代码删除Shape后再恢复出现无法再次获取的问题
做PowerPoint的VSTO插件项目,遇到个很奇怪的问题,当代码执行删除某些Shape时,没问题,但是操作Undo也就是恢复后,无法再次获取到之前删除的对象,这种情况只在Office2007中出现 ...
- C和指针 第十七章 习题
17.8 为数组形式的树编写模块,用于从树中删除一个值,如果没有找到,程序节点 ArrayBinaryTree.c // // Created by mao on 16-9-18. // #inclu ...