Java项目中调用Kettle转换

来源:互联网 发布:淘宝店铺话费充值软件 编辑:程序博客网 时间:2024/06/05 06:22

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() {@Overridepublic 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 0
原创粉丝点击