java程序控制KETTLE JOB的執行


有時候我們想在java程序中觸發遠程服務器上kettle job的執行,並且獲得執行結果。kettle的carte提供了遠程執行job和transfer的功能。

我使用的kettle是6.1版本,部署在linux服務器上,沒有使用資源庫。

下面介紹下各個步驟:為了方便以windows系統為例

1、開啟carte服務,在kettle安裝目錄下,運行Carte.bat,直接上圖

直接打Carte.bat后面不帶任何參數就可以看到參數介紹,我這里在本機8081端口開啟服務,看到最后的文字說明服務啟動成功。

 

2、在瀏覽器中查看kettle 狀態

在瀏覽器中輸入http://172.20.17.113:8081,會提示輸入密碼,這里先直接輸入cluster/cluster,然后可以進入,頁面上會顯示通過carte執行的job和transfer的狀態。

那么這個用戶名密碼在哪設置呢?我找了半天,也是網上看前輩指引,原來是在kettle安裝目錄/pwd下面,大家可以看到有carte-config-8081到8084這些配置文件,還有carte-config-master-8080.xml,應該是做主從集群用的,先不管了。

打開carte-config-8081.xml就可以看到

<slaveserver>
<name>slave1-8081</name>
<hostname>localhost</hostname>
<port>8081</port>
<username>cluster</username>
<password>cluster</password>
<master>N</master>
</slaveserver>

端口號跟用戶名密碼的默認配置都在這里了。

 

3、使用java觸發JOB執行。

下面介紹真正要做的事情了,建立java project。把kettle安裝目錄/lib下面相關jar包依賴上去。需要的包挺多的,懶得話全部依賴吧。我這邊依賴這些包就夠了,因為用到了spring讀取文件的工具,也依賴了spring的包。

 

代碼邏輯如下:

 

package com.lzh.kettle;

import org.pentaho.di.cluster.SlaveServer;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.Result;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobExecutionConfiguration;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.www.SlaveServerJobStatus;
import org.springframework.core.io.FileSystemResource;

public class kettleRemoteDemo {
    public static void main(String[] args) {
        String jobPath = "E:\\ws0815\\xnol-reporting-app-trunk\\etl\\kettle\\jobs\\jb_current_account_order_latest5.kjb";
        try {
            KettleEnvironment.init();

            SlaveServer remoteSlaveServer = new SlaveServer();
            remoteSlaveServer.setHostname("172.20.17.113");// 設置遠程IP
            remoteSlaveServer.setPort("8081");// 端口
            remoteSlaveServer.setUsername("cluster");
            remoteSlaveServer.setPassword("cluster");
            FileSystemResource r = new FileSystemResource(jobPath);
            // jobname 是Job腳本的路徑及名稱
            JobMeta jobMeta = new JobMeta(r.getInputStream(), null, null);

            JobExecutionConfiguration jobExecutionConfiguration = new JobExecutionConfiguration();
            jobExecutionConfiguration.setRemoteServer(remoteSlaveServer);// 配置遠程服務

            String lastCarteObjectId = Job.sendToSlaveServer(jobMeta, jobExecutionConfiguration, null, null);
            System.out.println("lastCarteObjectId=" + lastCarteObjectId);
            SlaveServerJobStatus jobStatus = null;
            do {
                Thread.sleep(5000);
                jobStatus = remoteSlaveServer.getJobStatus(jobMeta.getName(), lastCarteObjectId, 0);
            } while (jobStatus != null && jobStatus.isRunning());
            Result oneResult = new Result();
            System.out.println(jobStatus);
            if (jobStatus.getResult() != null) {
                // 流程完成,得到結果
                oneResult = jobStatus.getResult();
                System.out.println("Result:" + oneResult);
            } else {
                System.out.println("取到空了");
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    }
}

 這里因為job執行需要一些時間,我代碼里面每隔5秒去拿一下結果,拿到結果確定job是否執行完成。

這時候如果我們去瀏覽器查看,可以看到job正在執行的狀態。

執行完成之后Running會變成Finish,如果有異常,status也會有提示。在命令行下面也會有job執行的日志信息。

大致過程就是這樣,但是我研究的時候還是花了不少時間,網上資料不是很多,我這個算是完整介紹吧。

還有一個問題就是,我的job文件需要在本地保存一份,最開始我一直想的是我的job文件放到KETTLE所在服務器上,在代碼中我指定指向job文件的路勁即可,但是運行的時候,kettle總是去本地路勁找文件然后找不到就報錯。后來我想可能我的這種想法需要依賴kettle的資源庫才能實現。而我沒有使用資源庫所以我必須在我java程序所在服務器放置job文件,然后去kettle所在遠程服務器執行。

如果有朋友能解決我最后的疑慮,還望留言指點。謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM