JAVA 调用 KETTLE

  • pom.xml
<dependency>
    <groupId>pentaho-kettle</groupId>
    <artifactId>kettle-core</artifactId>
    <version>8.3.0.0-371</version>
</dependency>

<dependency>
    <groupId>pentaho-kettle</groupId>
    <artifactId>kettle-engine</artifactId>
    <version>8.3.0.0-371</version>
</dependency>

<dependency>
    <groupId>pentaho-metastore</groupId>
    <artifactId>metastore</artifactId>
    <version>8.3.0.0-371</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-vfs2</artifactId>
    <version>2.1</version>
</dependency>

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.46</version>
</dependency>

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
  • 如果下载不了,就把下列 .jar 文件上传到 maven 仓库里,下载资源地址:(https://download.csdn.net/download/qq_41657176/13211587)
  • 如果需要用到 ftp 和 JavaScript 的话,就需要引入以下两个包,下载资源地址:(https://download.csdn.net/download/qq_41657176/13590955)
  • 配置文件:application-config.yml
kettle-config:
  url: D:\ETL_file
  • 配置类
@Component
@ConfigurationProperties(
        prefix = "kettle-config"
)
public class KettleConfig {
    private String url;

    public KettleConfig() {
    }

    public String getUrl() {
        return this.url;
    }

    public void setUrl(final String url) {
        this.url = url;
    }

    public String toString() {
        return "KettleConfig(url=" + this.getUrl() + ")";
    }
}
  • 加入日志,注入配置类
private static final Logger log = LogManager.getLogger(KettleController.class);

@Autowired
private KettleConfig kettleConfig;
  • 调用转换例子(以 controller 层举例)
/**
 * @Author 邱少鲲
 * @MethodName localTrans
 * @Description 调用转换
 * @Date 10:20 2020/12/1
 * @Param param[0]:调用的文件名; param[i]:传入 KEY; param[i+1]:传入 VALUE
 * @return java.lang.String
 **/
@RequestMapping({"localTrans"})
public String localTrans(@RequestParam(value = "params",defaultValue = "") String... params) {
    int length = params.length;
    if (length % 2 == 0) {
        return "执行失败!";
    } else {
        try {
            String fileName = this.kettleConfig.getUrl() + File.separator + params[0];
            log.info("文件名:" + params[0]);
            File file = FileUtil.file(fileName);
            String path = file.getPath();
            KettleEnvironment.init();
            TransMeta transMeta = new TransMeta(path);
            Trans trans = new Trans(transMeta);
            if (length > 1) {
                log.info("--------------传入参数-----------------");
                log.info(":");

                for(int i = 0; i < params.length - 1; i += 2) {
                    trans.setParameterValue(params[i + 1], params[i + 2]);
                    log.info("传入的key:" + params[i + 1] + "传入的value:" + params[i + 2]);
                }

                log.info("-------------------------------------");
            }

            trans.prepareExecution((String[])null);
            trans.startThreads();
            trans.waitUntilFinished();
            return "执行成功!";
        } catch (Exception var9) {
            var9.printStackTrace();
            return "执行失败!";
        }
    }
}
  • 调用作业例子(以 controller 层举例)
/**
 * @Author 邱少鲲
 * @MethodName localJobs
 * @Description //调用作业
 * @Date 16:09 2020/12/1
 * @Param param[0]:调用的文件名; param[i]:传入 KEY; param[i+1]:传入 VALUE
 * @return java.lang.String
 **/
@RequestMapping({"localJobs"})
public String localJobs(@RequestParam(value = "params", defaultValue = "") String... params) {
    int length = params.length;
    if (length % 2 == 0) {
        return "执行失败!";
    } else {
        try {
            String fileName = this.kettleConfig.getUrl() + File.separator + params[0];
            log.info("文件地址:" + fileName);
            KettleEnvironment.init();
            JobMeta jobMeta = new JobMeta(fileName, null);
            Job job = new Job(null, jobMeta);
            Map<String, Object> paramsMap = new HashMap<>();
            if (length > 1) {
                log.info("--------------传入参数-----------------");
                for(int i = 0; i < params.length - 1; i += 2) {
                    paramsMap.put(params[i + 1], params[i + 2]);
                    log.info("传入的key:" + params[i + 1] + "传入的value:" + params[i + 2]);
                }
                log.info("-------------------------------------");
            }
            
            setParams(job, paramsMap, jobMeta);
            job.start();
            job.waitUntilFinished();
            return "执行成功!";
        } catch (Exception var9) {
            var9.printStackTrace();
            return "执行失败!";
        }
    }
}

private void setParams(Job job, Map<String, Object> params, JobMeta jobMeta) {
    if (Assert.isEmpty(params)) {
        return;
    }

    // 区分参数列表有还是没有,如果有,还要考虑参数不全的情况
    String[] jobMetaParams = jobMeta.listParameters();
    List<String> keys = new ArrayList<>();
    for (String s : jobMetaParams) {
        keys.add(s);
    }

    try {
        for (String key : params.keySet()) {
            if (!keys.contains(key)) {
                jobMeta.addParameterDefinition(key, null, "");
                job.addParameterDefinition(key, null, "");
            }
            // 赋值, 通过上面的addParame...将没有的key添加进去后,就可以用下面通用的赋值
            jobMeta.setParameterValue(key, params.get(key).toString());
            job.setParameterValue(key, params.get(key).toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  • 记住如果要修改数据库东西的时候要连接数据库哦!sprinboot 连接数据库可以看这篇文章:(https://blog.csdn.net/qq_41657176/article/details/100113282)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值