kettle中调用java类
kettle中调用java类
有时须要在kettle调用java类,如:验证、查询或自己定义加密等。有时甚至连主要的数据訪问都不那么简单,如获取一个存储文件或使用一个数据库连接,某些数据源可能封装在应用程序中,手工使用自己定义的javaclient訪问是唯一的方法。
本文介绍怎样在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 < md5Digest.length; 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类实例,稍不在意,使用这样的方式非常easy覆盖。
接着是调用简单的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实现过的需求。这时你能够考虑使用这样的方法试试。
当使用脚步代码总是须要监视性能问题。假设你使用了大量的外部库。就须要有正确的版本号依赖管理,否则在測试环境或部署环境中会产生问题。
kettle中调用java类的更多相关文章
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
- python_代码中调用java类
1. 安装jpype (python调用java class文件用) 1.1. 自动安装:pip install jpype1 1.2. 手动方式安装jpype1 安装wheel:pip instal ...
- thymeleaf模板引擎调用java类中的方法(附源码)
前言 <Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦> 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决 ...
- Jsp中如何通过Jsp调用Java类中的方法
Jsp中如何通过Jsp调用Java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:cn.tianaoweb.com; 2.再在包中添加一个类:如 package com; public ...
- Thymeleaf常用语法:模板文件中表达式调用Java类的静态方法
在模板文件的表达式中,可以使用“${T(全限定类名).方法名(参数)}”这种格式来调用Java类的静态方法. 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1. ...
- oracle调用JAVA类的方法
导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了, 1.操作系统需要拥有支持loadjava命令的jdk. 2.加 ...
- kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件
该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...
- Java Native Interfce三在JNI中使用Java类的普通方法与变量
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...
- C#调用java类、jar包方法(转)
一.将已经编译后的java中Class文件进行打包:打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理: 使用的命令:jar cvf test.jar -C com/ . 其中tes ...
随机推荐
- TPen的7种Style和16种Mode
//TPen 的主要属性有四: Color.Width.Style.Mode {Color: 颜色} {Width: 宽度; 默认是 1; 如果赋予 <= 0 的值, 会使用默认值} {Styl ...
- logstash 根据type 判断输出
# 更多ELK资料请访问 http://devops.taobao.com 一.配置前需要注意: 1.Use chmod to modify nginx log file privilege. E.g ...
- c++犯过的严重错误
1.if(num == 0)写成了if(num = 0)导致软件运行一直崩溃且找不到原因,浪费了很大的代价,以后我写这种语法的时候一直写if(0 == num) 2.if (sting.find(&q ...
- get the first and last collection item in Magento
$product_collection->getFirstItem() $product_collection->getLastItem()
- JavaScript引用类型之RegExp类型(正则表达式)
ECMAScript中使用RegExp来支持正则表达式.使用下面类似Perl的语法,就可以创建一个正则表达式. var expression=/pattern/flags; 如上代码: pattern ...
- JavaScript之JSON
一.简介:Json是JavaScript中读取结构化数据更好的方式.因为Json数据可以直接传给eval(),而且不必创建DOM对象.Json是一种数据格式,不是一种编程语言,虽然具有相同的语法形式, ...
- 在IOS开发中,属性名为id的处理方法
在.h 文件中定义属性名为id { int _id; } @property (nonatomic, assign) int id; 在.m 文件中用synthesize声明该属性,会自动生成get和 ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- 构造HTTP请求Header实现"伪造来源IP"
构造 HTTP请求 Header 实现“伪造来源 IP ” 在阅读本文前,大家要有一个概念,在实现正常的TCP/IP 双方通信情况下,是无法伪造来源 IP 的,也就是说,在 TCP/IP 协议中,可以 ...
- js函数定时器,定时读取系统实时连接数
function GetDeviceInfo() { setInterval(function() { GetDeviceRealtimeConnect(); ...