java调用kettle向job(任务)和transformation(转换)传递参数实例

来源:互联网 发布:易语言玫瑰花表白源码 编辑:程序博客网 时间:2024/06/04 20:01
 最近要对一个系统的数据同步到另一个系统中,要求新系统的数据结果完成之后,实时同步到另一个系统数据表中。
      也就是动态的传一个关联的ID。由于旧系统是vb做的,无法提供webservice接口,并且同步的表涉及到十几张表,并且两个系统表结构完全不一样,所以想到了kettle。
      java集成kettle网上有现成的实例,很简单。如:http://bakcom.iteye.com/blog/1399587

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

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.      * 本测试类慎用!!!!!!! 
  3.      *  
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         String datetime = "2014-12-19 23:20:45";  
  8.         String[] params = {"707", datetime}; // 传递参数   
  9.         String path = "F:\\job7.kjb";  
  10.           
  11. //      runTransfer(params, path);  
  12.         runJob(params, path);  
  13.         // runJob();  
  14. //      jbResource();  
  15.   
  16.     }  
  17.   
  18.     /**  
  19.      * 运行转换文件方法 
  20.      * @param params 多个参数变量值 
  21.      * @param ktrPath 转换文件的路径,后缀ktr 
  22.      */  
  23.     public static void runTransfer(String[] params, String ktrPath) {  
  24.         Trans trans = null;  
  25.         try {  
  26.             // // 初始化  
  27.             // 转换元对象  
  28.             KettleEnvironment.init();// 初始化  
  29.             EnvUtil.environmentInit();  
  30.             TransMeta transMeta = new TransMeta(ktrPath);  
  31.             // 转换  
  32.             trans = new Trans(transMeta);  
  33.               
  34.             // 执行转换  
  35.             trans.execute(params);  
  36.             // 等待转换执行结束  
  37.             trans.waitUntilFinished();  
  38.             // 抛出异常  
  39.             if (trans.getErrors() > 0) {  
  40.                 throw new Exception(  
  41.                         "There are errors during transformation exception!(传输过程中发生异常)");  
  42.             }  
  43.         } catch (Exception e) {  
  44.             e.printStackTrace();  
  45.         }  
  46.     }  
  47.   
  48.     /** 
  49.      * java 调用 kettle 的job 
  50.      *  
  51.      * @param jobname 
  52.      *            如: String fName= "D:\\kettle\\informix_to_am_4.ktr"; 
  53.      */  
  54.     public static void runJob(String[] params, String jobPath) {  
  55.         try {  
  56.             KettleEnvironment.init();  
  57.             // jobname 是Job脚本的路径及名称  
  58.             JobMeta jobMeta = new JobMeta(jobPath, null);  
  59.             Job job = new Job(null, jobMeta);  
  60.             // 向Job 脚本传递参数,脚本中获取参数值:${参数名}  
  61.             // job.setVariable(paraname, paravalue);  
  62.             job.setVariable("id", params[0]);  
  63.             job.setVariable("dt", params[1]);  
  64.             job.start();  
  65.             job.waitUntilFinished();  
  66.             if (job.getErrors() > 0) {  
  67.                 throw new Exception(  
  68.                         "There are errors during job exception!(执行job发生异常)");  
  69.             }  
  70.         } catch (Exception e) {  
  71.             e.printStackTrace();  
  72.         }  
  73.     }  


[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">以上是片段。实现了调用任务和转换的方法,我只给出了调用任务和转换文件的方法,连接数据库的在此略过。</span>  

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

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


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



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

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

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




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

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



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

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


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

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

1 0
原创粉丝点击