java调用kettle_实现(2)

摘要:
(1) 参考“java调用kettle_introducing jar包(1)”,并在etl工具下应用lib中的所有jar(2)最近,一个系统的数据需要同步到另一个系统。新系统的数据结果完成后,需要将其实时同步到另一个系统的数据表中。换言之,它动态传输关联的ID。由于旧系统是由vb创建的,无法提供web服务接口,而且同步的表涉及十多个表,而且两个系统表的结构完全不同,所以我想到了水壶。Java集成

(1).参照“java调用kettle_导入jar包(1)”,应用etl工具下lib里的所有jar

(2).

最近要对一个系统的数据同步到另一个系统中,要求新系统的数据结果完成之后,实时同步到另一个系统数据表中。
      也就是动态的传一个关联的ID。由于旧系统是vb做的,无法提供webservice接口,并且同步的表涉及到十几张表,并且两个系统表结构完全不一样,所以想到了kettle。
      java集成kettle网上有现成的实例,很简单。如:http://bakcom.iteye.com/blog/1399587

      虽然网上文章有说Java可以传递参数给kettle,不过只找到了传递参数给转换的文章,没有讲参数传递给job,kettle中如何使用java传递的参数。今天就以上问题,一并共享。


import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.util.EnvUtil;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;

public class tests {

    /**
     * 本测试类慎用!!!!!!!
     *  
     * @param args
     */  
    public static void main(String[] args) {  
       String datetime = "2014-12-19 23:20:45";  
       String[] params = {"707", datetime}; // 传递参数   
       String path = "E:\job.kjb";
       for (int i = 0; i < 3; i++) {
           params[0] += i;
           runJob(params, path);  
    }
    }  
 
    /**  
     * 运行转换文件方法
     * @param params 多个参数变量值
     * @param ktrPath 转换文件的路径,后缀ktr
     */  
    public static void runTransfer(String[] params, String ktrPath) {  
        Trans trans = null;  
        try {  
            // // 初始化  
            // 转换元对象  
            //KettleEnvironment.init();// 初始化  
            EnvUtil.environmentInit();  
            TransMeta transMeta = new TransMeta(ktrPath);  
            // 转换  
            trans = new Trans(transMeta);  
              
            // 执行转换  
            trans.execute(params);  
            // 等待转换执行结束  
            trans.waitUntilFinished();  
            // 抛出异常  
            if (trans.getErrors() > 0) {  
                throw new Exception(  
                        "There are errors during transformation exception!(传输过程中发生异常)");  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
 
    /**
     * java 调用 kettle 的job
     *  
     * @param jobname
     *            如: String fName= "D:\kettle\informix_to_am_4.ktr";
     */  
    public static void runJob(String[] params, String jobPath) {  
        try {  
           KettleEnvironment.init();  
            // jobname 是Job脚本的路径及名称  
            JobMeta jobMeta = new JobMeta(jobPath, null);  
            Job job = new Job(null, jobMeta);  
            // 向Job 脚本传递参数,脚本中获取参数值:${参数名}  
            // job.setVariable(paraname, paravalue);  
            job.setVariable("id", params[0]);  
            System.err.println(params[0]+"=========="+params[1]);
            job.setVariable("dt", params[1]);  
            job.start();  
            job.waitUntilFinished();  
            if (job.getErrors() > 0) {  
                throw new Exception(  
                        "There are errors during job exception!(执行job发生异常)");  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

}

下面就是如何使用java传递的参数了。

转换的网上有例子,转换工作台,打开输入,找到“获取系统信息”

java调用kettle_实现(2)第1张

进行变量定义,选择命令参数1。。。n即可

java调用kettle_实现(2)第2张java调用kettle_实现(2)第3张


就可以引用我示例中的1,2参数了。

但是我们的迁移工作是要按顺序执行的,调用转换不够用,需要job来定义执行顺序,

比如上面的转换作为第一步,操作完进行其他步骤,那么在这个基础上,可以画一个job

java调用kettle_实现(2)第4张
java调用kettle_实现(2)第4张

java调用kettle_实现(2)第2张

java调用kettle_实现(2)第7张


java调用kettle_实现(2)第2张

这时候问题来了,我们要活得java的数据,同时这个job需要把参数传递给test2转换使用。

其实很简单,点开test2,切换到参数选型,将java定义的参数写进去,记住带{}

java调用kettle_实现(2)第9张

这里的参数指的是“位置参数

这样就大功搞成了。java已经能够顺利的将值传递给job,job可以顺利的将值传递给转换。

点击run this job 在variable中定义参数名称跟java传递的参数一致,可以写值进行测试

java调用kettle_实现(2)第10张

注意事项:任务和转换要存成文件格式,任务中引用的转换也要是文件格式,

否则就都需要数据库支撑,数据库方法调用了。

            来源:http://blog.csdn.net/dirful/article/details/42026545#comments

免责声明:文章转载自《java调用kettle_实现(2)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mac-VM迁移注意事项Qt使用笔记(2)--Qmake的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DATASNAP REST WEBSERVICES中间件如何跨平台使用

准备使用DELPHI开发移动设备开发的朋友对DATASNAP REST中间件不可不了解。 DATASNAP REST新型WEBSERVICES中间件使用的通信协议和数据封装格式: 使用HTTP通信协议,HTTP协议哪个平台都支持;使用JSON作为数据的封装格式,几乎所有的开发语言都可以解析JSON数据。 REST的目的就是通过简单的URL来完成对中间层远程...

Scala从入门到精通之四-映射和元组

在Scala中映射之键值对的集合,元组是n个对象的聚集,但是对象的类型不一定相同 本节内容要点   Scala中映射的创建,遍历和查询   如何从可变和不可变映射中做出选择   Scala映射和Java映射见的互操作   Scala中元组的使用 一.构造映射 我们可以这样来构造一个映射: val scores = Map("ysl"->100,"...

Spring 远程调用工具类RestTemplateUtils

Spring 远程调用Rest服务工具类,包含Get、Post、Put、Delete四种调用方式。 依赖jar <dependency> <groupId>org.springframework</groupId> <artifactId>s...

Android获取系统时间方法的总结

Android获取系统时间方法的方法有很多种,常用的有Calendar、Date、currentTimeMills等方法。 (1)Calendar Calendar获取系统时间首先要用Calendar.getInstance()函数获取一个实例,再为该实例设定时区(中国的时区为GMT+8:00),最后使用Calendar.get()函数获取时间的具体信息,...

用C#实现Web代理服务器3

  9.创建Proxy类中的Run方法。Run方法是Proxy类中唯一的方法。其功能是从客户端接收HTTP请求,并传送到Web服务器,然后从Web服务器接收反馈来的数据,并传送到客户端。为了实现这二个不同方面的数据传送,Run方法中是通过两个Socket实例来实现的。在编写Run方法的时候,要注意下面两点:   (1)由于HTTP建立于TCP协议之上,所以...

es版本2.x的string和5.x的keyword,text的区别和联系

一 es2.x和es5.x版本定义字符串类型 2.x版本的es string的类型 全文检索   分词   index=analysis  按单个字符匹配    被称作analyzed字符串 关键词搜索 不分词  index=not_analysis  按照整个文本进行匹配  被称为not-analyzed字符串 index=no  表示不被索引,产生的后...