之前只做了一个java调用单一ktr的例子,在用web程序控制ETL数据抽取过程的时候,难免会遇到要执行一个复选框列表的ktr,那么前段传过来的就不仅仅是一个ktr;那就是一个未知数目的ktr列表了,思想就是封装:遍历:赋值:执行;
1 package kettle; 2 3 //需要导入的包 4 5 import java.util.ArrayList; 6 import org.pentaho.di.core.KettleEnvironment; 7 import org.pentaho.di.trans.TransMeta; 8 import org.pentaho.di.trans.Trans; 9 public class ExecuteBatchLocalTran { 10 /** 11 * java调用本地的tran并且传递参数(包括给SQL传参) 12 */ 13 14 public static void main(String arg[]) throws Exception 15 { 16 /*前台页面传递的参数*/ 17 String idname="7";//参数值 18 String filename1="./test1.ktr";//ktr路径 19 String filename2="./test2.ktr";//ktr路径 20 KettleEnvironment.init();//初始化kettle环境 21 /*定义文件路径,模型元数据,模型三个容器*/ 22 ArrayList<String> list1=new ArrayList<String>(); 23 ArrayList<TransMeta> list2=new ArrayList<TransMeta>(); 24 ArrayList<Trans> list3=new ArrayList<Trans>(); 25 /*添加文件对象*/ 26 list1.add(filename1); 27 list1.add(filename2); 28 //System.out.print("=======================1:"+list1.get(0)); 29 //System.out.print("=======================2:"+list1.get(1)); 30 /*遍历文件对象,创建转换元数据对象*/ 31 for(int i=0;i<list1.size();i++) 32 { 33 TransMeta transMeta = new TransMeta(list1.get(i));//new tran的源数据对象 34 list2.add(transMeta); 35 } 36 /*遍历转换元数据对象,创建转换对象*/ 37 for(int j=0;j<list2.size();j++) 38 { 39 Trans trans = new Trans(list2.get(j));//创建tran对象 40 list3.add(trans); 41 } 42 /*遍历转换对象,执行列表转换*/ 43 for(int h=0;h<list3.size();h++) 44 { 45 Trans trans =list3.get(h);//创建tran对象 46 trans.setVariable("idname",idname);//传参给对象 47 trans.prepareExecution(null);//异常处理 48 trans.startThreads();//开始执行 49 trans.waitUntilFinished();//等待执行完毕 50 51 if(trans.getErrors()!=0) 52 { 53 System.err.println("Error encountered!"); 54 } 55 else 56 { 57 System.out.println("Success"); 58 } 59 60 } 61 62 63 64 65 66 67 } 68 69 }