博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java项目调用kettleJob和Trans
阅读量:5842 次
发布时间:2019-06-18

本文共 8479 字,大约阅读时间需要 28 分钟。

1、调用本地Job和Trans

  较简单不用多说没有遇到任何问题,以下是代码:

import org.pentaho.di.core.KettleEnvironment;import org.pentaho.di.core.database.DatabaseMeta;import org.pentaho.di.core.exception.KettleException;import org.pentaho.di.core.util.EnvUtil;import org.pentaho.di.job.Job;import org.pentaho.di.job.JobMeta;import org.pentaho.di.repository.Repository;import org.pentaho.di.trans.Trans;import org.pentaho.di.trans.TransMeta;import org.pentaho.di.repository.RepositoryDirectoryInterface;import org.pentaho.di.repository.kdr.KettleDatabaseRepository;import org.pentaho.di.repository.kdr.KettleDatabaseRepositoryMeta;public class MyUtils {    public static void main(String[] args) {        String[] params = {"1","content","d:\\test1.txt"};        runTransfer(params, "D:\\一起浪\\数据资源管理平台\\kettle\\test.ktr");    }      /**       * 运行转换文件方法      * @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]);              job.setVariable("content", params[1]);              job.setVariable("file", params[2]);              job.start();              job.waitUntilFinished();              if (job.getErrors() > 0) {                  throw new Exception(                          "There are errors during job exception!(执行job发生异常)");              }          } catch (Exception e) {              e.printStackTrace();          }      }  }
调用本地Job和Trans

2、连接oracle资源库

  调用资源库中的Trans,并在本地执行,以下是代码:

/**      * 执行存储在数据库资源库中的转换      *       * @Description:      * @throws KettleException      * @author Jeffy      * @since:2016-9-23     */      public static void executeTrans(String transName) throws KettleException {          //初始化kettle环境        KettleEnvironment.init();        //创建资源库对象,此时的对象还是一个空对象        KettleDatabaseRepository repository = new KettleDatabaseRepository();        //创建资源库数据库对象,类似我们在spoon里面创建资源库        DatabaseMeta dataMeta = new DatabaseMeta("ETL", "Oracle", "Native(JDBC)", "127.0.0.1", "DBname", "1521",                "username", "password");         //资源库元对象,名称参数,id参数,描述等可以随便定义        KettleDatabaseRepositoryMeta kettleDatabaseMeta =         new KettleDatabaseRepositoryMeta("ETL", "ETL", "ETL description",dataMeta);        //给资源库赋值        repository.init(kettleDatabaseMeta);        //连接资源库        repository.connect("admin","admin");        //根据变量查找到模型所在的目录对象,此步骤很重要。        RepositoryDirectoryInterface directory = repository.findDirectory("/test");        //创建ktr元对象        TransMeta transMeta = ((Repository) repository).loadTransformation(transName, directory, null, true, null ) ;        //执行参数        String[] params = {"1","07bb40f7200448","d:\\haha.txt"};        //创建ktr        Trans trans = new Trans(transMeta);        //执行ktr        trans.execute(params);        //等待执行完毕        trans.waitUntilFinished();                if(trans.getErrors()>0)        {                               System.err.println("Transformation run Failure!");        }        else        {            System.out.println("Transformation run successfully!");        }    }

  过程中,KettleEnvironment.init();语句报错一般由于jar包没有引全,可根据错误的包名,去找到应该引入却未引入的jar包。另外,loadTransformation时遇到一个比较特别的错误:

2016/10/08 10:32:19 - ETL - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : 当读共享文件时发生错误(继续加载): org.pentaho.di.core.exception.KettleDatabaseException:

2016/10/08 10:32:19 - ETL - Error determining value metadata from SQL resultset metadata
2016/10/08 10:32:19 - ETL - For input string: "4294967295"
2016/10/08 10:32:19 - ETL - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : org.pentaho.di.core.exception.KettleDatabaseException:
2016/10/08 10:32:19 - ETL - Error determining value metadata from SQL resultset metadata
2016/10/08 10:32:19 - ETL - For input string: "4294967295"
2016/10/08 10:32:19 - ETL -
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.core.row.value.ValueMetaBase.getValueFromSQLType(ValueMetaBase.java:4588)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.core.database.Database.getValueFromSQLType(Database.java:2267)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.core.database.Database.getRowInfo(Database.java:2229)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.core.database.Database.getRow(Database.java:2341)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.core.database.Database.getLookup(Database.java:2713)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.core.database.Database.getLookup(Database.java:2703)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.core.database.Database.getLookup(Database.java:2699)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.repository.kdr.delegates.KettleDatabaseRepositoryConnectionDelegate.getTransAttributeRow(KettleDatabaseRepositoryConnectionDelegate.java:619)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.repository.kdr.delegates.KettleDatabaseRepositoryConnectionDelegate.getTransAttributeString(KettleDatabaseRepositoryConnectionDelegate.java:761)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.repository.kdr.delegates.KettleDatabaseRepositoryTransDelegate.getTransAttributeString(KettleDatabaseRepositoryTransDelegate.java:1481)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.repository.kdr.delegates.KettleDatabaseRepositoryTransDelegate.readTransSharedObjects(KettleDatabaseRepositoryTransDelegate.java:1490)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.repository.kdr.delegates.KettleDatabaseRepositoryTransDelegate.loadTransformation(KettleDatabaseRepositoryTransDelegate.java:500)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.repository.kdr.KettleDatabaseRepository.loadTransformation(KettleDatabaseRepository.java:278)
2016/10/08 10:32:19 - ETL -     at com.inspur.commons.MyUtils.executeTrans(MyUtils.java:107)
2016/10/08 10:32:19 - ETL -     at com.inspur.commons.NewTest.main(NewTest.java:126)
2016/10/08 10:32:19 - ETL - Caused by: java.lang.NumberFormatException: For input string: "4294967295"
2016/10/08 10:32:19 - ETL -     at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
2016/10/08 10:32:19 - ETL -     at java.lang.Integer.parseInt(Integer.java:495)
2016/10/08 10:32:19 - ETL -     at java.lang.Integer.parseInt(Integer.java:527)
2016/10/08 10:32:19 - ETL -     at oracle.jdbc.driver.OracleResultSetMetaData.getPrecision(OracleResultSetMetaData.java:331)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.core.row.value.ValueMetaBase.getOriginalColumnMetadata(ValueMetaBase.java:4608)
2016/10/08 10:32:19 - ETL -     at org.pentaho.di.core.row.value.ValueMetaBase.getValueFromSQLType(ValueMetaBase.java:4561)
2016/10/08 10:32:19 - ETL -     ... 14 more
2016/10/08 10:32:19 - ETL - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : 一个数据库错误发生在从资源库文件读取转换时
2016/10/08 10:32:19 - ETL - org.pentaho.di.core.exception.KettleDatabaseException:
2016/10/08 10:32:19 - ETL - ERROR executing query
2016/10/08 10:32:19 - ETL -
2016/10/08 10:32:19 - ETL - Error determining value metadata from SQL resultset metadata
2016/10/08 10:32:19 - ETL - For input string: "4294967295"

这是由于oracle的jar包版本不对,原本引入的是ojdbc14.jar,去kettle目录\pdi-ce-6.1.0.1-196\data-integration\lib里找到ojdbc14-10.2.0.1.0.jar,替换掉原来的jar包就可以了。

3、远程调用

nohup  ./carte.sh  127.0.0.1  8080 > ./log/carte.log &

转载于:https://www.cnblogs.com/superJF/p/5937611.html

你可能感兴趣的文章
SQL语句学习
查看>>
初次安装系统注意选项
查看>>
mysql的SQL性能监控
查看>>
使用Dockerfile构建镜像
查看>>
大学生IT博客大赛开赛 相关报道
查看>>
tcpdump使用方法总结
查看>>
What is Cluster Aware Updating in Windows Server 2012?
查看>>
Linux命令详解 -- tar
查看>>
Java.net.URL学习总结
查看>>
Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据包访问目标所采取的路径。...
查看>>
进老男孩的自我介绍和决心书
查看>>
Leetcode Construct Binary Tree from Inorder and Postorder Traversal
查看>>
线上Linux服务器运维安全策略经验分享
查看>>
Django实现组合搜索的方法示例
查看>>
Android一些问题的解决方案
查看>>
Clion 常用快捷键
查看>>
ios之UIToolBar
查看>>
10道典型的JavaScript面试题
查看>>
centos 6.5 docker  安装
查看>>
依然前往
查看>>