首页 > 数据库 > mysql教程 > kettle中调用java类

kettle中调用java类

WBOY
发布: 2016-06-07 16:04:49
原创
1839 人浏览过

kettle中调用java类 有时需要在kettle调用java类,如:验证、查询或自定义加密等。有时甚至连基本的数据访问都不那么简单,如获取一个存储文件或使用一个数据库连接,某些数据源可能封装在应用程序中,手工使用自定义的java客户端访问是唯一的方法。本文介绍

kettle中调用java类

有时需要在kettle调用java类,如:验证、查询或自定义加密等。有时甚至连基本的数据访问都不那么简单,如获取一个存储文件或使用一个数据库连接,某些数据源可能封装在应用程序中,手工使用自定义的java客户端访问是唯一的方法。本文介绍如何在kettle中调用java类。示例代码在这里下载

注:如果你使用kettle4.0及以上版本,也你也可以使用user defined java class 步骤实现。

Modified Java ScriptValue 步骤

关键要在kettle中使用ModifiedJava Script Value 步骤。从名称上看是仅仅执行javascript来实现该步骤,其实也可以执行java代码。为了理解,我们需要知道该步骤使用Rhino javaScript 引擎来实现,使其可以在jvm中实现javascript,也使其成为可能,让脚本去访问java类。为了说明其如何实现,让我们来看一个简单的转换示例,使用java去计算某个字段的md5码。如下图所示:

javascript步骤实现md5计算,包含如下代码:

// simulate java imports

varMessageDigest =java.security.MessageDigest;

varString =java.lang.String;

varStringBuffer =java.lang.StringBuffer;

varInteger =java.lang.Integer;

// get the md5 digest algorithm

varalgorithm =MessageDigest.getInstance("MD5");

// get the input as bytes

varbytes = newString(test_value).getBytes("UTF-8");

// calculate the digest

algorithm.reset();

algorithm.update(bytes);

varmd5Digest =algorithm.digest(); 

// turn the digest into a hex-stringrepresentation

varhexString = newStringBuffer(); 

for(vari =0; i

varhex= Integer.toHexString(0xFF & md5Digest[i]);

if(hex.length()== 1){

hexString.append('0');

}

hexString.append(hex);

}

// write output value

varmd5_hash =hexString.toString().toUpperCase();

让我们详细解释以上代码。

第一部分是就如java 导入包环节,事实上和java中import实现同样目的。声明变量指向java类,是为了避免我们后面引用每个java类使用完整java长类名带来不便。当使用自己定义的类是,要注意不小心覆盖了javascript类。javascript也有其自己的Date类实例,稍不在意,使用这种方式很容易覆盖。

接着是调用简单的java API生成md5值,需要指出的是,输入字段作为javascript对象,“test_value”字段是javascript String对象,有多种方法将其转换成java String对象,这里使用简单的构造函数实现;java String的getBytes()方法返回字节数组;

md5摘要值计算好后,接着通过一小段循环代码生成表现该值的字符串,最后作为一个新字段写到输出行。

使用外部jar包中的类

执行太多的脚步可能影响性能,所以总是把复杂的业务让编译好的java代码来做,通常是一些整洁的实现我们业务的java类库,有时我们可能自己去创建。kettle现有的功能当然不能满足我们的所有需求,调用几个外部类库可以避免写一个完整kettle插件。kettle启动时加载libext目录及子目录下所有jar文件,如果你需要访问自定义jar包的类,需要放在libext文件中。我们示例是关于MD5,从kettle3.2已经有了相应的jar包(apache commons codec项目)。codec项目有很好的方法计算输入字符串的MD5十六进制字符串,正好是我们需要的;我们仅仅使用DigestUtil类的方法即可。

//get a nice md5 hash

varmd5_hash = org.apache.commons.codec.digest.DigestUtils.md5Hex(test_value);

在我笔记本上运行新转换大概10500行/秒,第一版本的仅仅大概2900行/秒.

\

两者的处理速度差别很大,所以用封装好的功能似乎真的飞快,当然有可能apache项目采用完全不同的MD5算法实现。无论怎样,后者的实现既简单又快。

结论

Modified Java Script Value 步骤允许访问任何jvm中java类。如果你ETL项目有特定的需求,你已经使用java实现过的需求,这时你可以考虑使用这种方法试试。当使用脚步代码总是需要监视性能问题。如果你使用了大量的外部库,就需要有正确的版本依赖管理,否则在测试环境或部署环境中会产生问题。

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板