Java项目中调用Kettle转换

Kettle版本:6.0.0.0.0.353

JDK:1.7_75

需要的Jar包(kettle-core-6.0.0.0-353.jar、kettle-engine-6.0.0.0-353.jar、metastore-6.0.0.0-353.jar)这三个是主要的

其他可能需要的包(apache-commons相关的、slf4j、javassist 等)。

把基本三个把加进去,启动之后根据具体提示补全剩下的包就好。所有的包,在Kettle的解压包里 \lib 都有


首先,第一步是要有一个转换文件。

如图,我的转换功能是,将一个Excel文件获取,做一些数据验证,然后返回给Java代码处理,中间会记录出错的总记录数。

该转换需要一个参数,输入Excel文件路径。

最后的空操作是为了在代码中用来监听该步骤来获取数据。


实现代码如下:

1、初始化Kettle。这个有个梗,对于Web项目,必须要更改一下用户目录,否则直接初始化第一次要加载很久才会有响应,更改完之后要改回来。

具体差异可以在命令行中输出一下   user.dir  来看看。更改之后生成的位置,WEB项目应该是在 WEB-INF目录下,会产生一个 .kettle 的文件夹,

里面包含一个kettle.properties 配置文件

logger.info("Kettle Init...");
// if (!KettleEnvironment.isInitialized()) {
// 获得执行类的当前路径
String user_dir = System.getProperty("user.dir");
// Kettle初始化需要修改相应的配置路径
System.setProperty("KETTLE_HOME", kettleHome);
System.setProperty("user.dir", kettleHome);
// 运行环境初始化(设置主目录、注册必须的插件等)
KettleEnvironment.init();
// Kettle初始化完毕,还原执行类的当前路径
System.setProperty("user.dir", user_dir);
// }
2、创建转换对象,并指定转换文件位置。 setParameterValue 给转换的变量设值,将Excel文件的位置传过去。

String path = KettleUtils.class.getResource("/").toURI().getPath();
path += "ExcelTransform.ktr";
TransMeta tm = new TransMeta(path);
Trans trans = new Trans(tm);
// trans.setLogLevel(LogLevel.ERROR);
trans.setParameterValue("FILE_PATH", excelPath);
trans.prepareExecution(null);
logger.info("Kettle Recording...");

3、记录每行的数据,并存在内存里 (数据量大的时候不建议直接这样做),然后启动。

这里的步骤是:getSteps 先获取转换里所有的步骤,如上图,通俗讲就是每一个图标节点。

然后steps.get 获取指定的步骤,上面说了我们监听最后一个步骤,那直接取 总步骤数的 size - 1 就好了。

然后给该步骤添加行监听器,在监听器的处理里获取数据并添加到List集合里,最后正式启动,并等待执行完成。

// 记录导入的每行数据
final List<RowMetaAndData> rows = new ArrayList<RowMetaAndData>();
RowListener rowListener = new RowAdapter() {
@Override
public void rowWrittenEvent(RowMetaInterface rowMeta, Object[] row) throws KettleStepException {
	rows.add(new RowMetaAndData(rowMeta, row));
}
};
List<StepMetaDataCombi> steps = trans.getSteps();
String stepname = steps.get(steps.size() - 1).stepname;
StepInterface stepInterface = trans.findRunThread(stepname);
stepInterface.addRowListener(rowListener);
// 启动并等待执行完成
trans.startThreads();
trans.waitUntilFinished();
logger.info("Kettle Processing...");
4、后续就是数据处理了,数据都已经到 List<RowMetaAndData> rows 里面了。通过字段名获取,第二个参数为值为空时的默认值。
for (int i = 0; i < rows.size(); i++) {
    RowMetaAndData rmad = rows.get(i);
    String rowNo = rmad.getString("rowNo", null);
    String errorCount = rmad.getString("errorCount", null);
    String errorTips = rmad.getString("errorTips", null);
}
5、最后

KettleEnvironment.shutdown();

总体流程如上。提供给需要的一个参考。

这里有需要获取Kettle工具的日志输出也可以。提供另一篇文章记录的以供参考

http://blog.csdn.net/leave00608/article/details/50177231

提供一个Kettle 4.4版本的API CHM文件下载。找不着更高版本的......不过一样能用,稍微有点变动

http://download.csdn.net/detail/leave00608/9509596

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值