Java調用Kettle執行任務或轉換,需要使用Kettle中的jar,可以先導入lib目錄中的幾個基本的jar,如:kettle-core.jar、kettle-db.jar、kettle-engine.jar ,其它jar根據情況進行添加,所需的jar在<kettle-home>\lib、<kettle-home>\libext下面都可以找到,本示例引用的jar如下圖:
之後編寫代碼測試Java調用,調用前先使用Kettle的設計器設計了一個轉換,取名爲voucher.ktr。另外,本示例使用的是Kettle3.2的版本,據說4.1版本調用方法會有不同。
import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.logging.LogWriter; import org.pentaho.di.core.util.EnvUtil; import org.pentaho.di.job.Job; import org.pentaho.di.job.JobEntryLoader; import org.pentaho.di.job.JobMeta; import org.pentaho.di.repository.Repository; import org.pentaho.di.repository.RepositoryDirectory; import org.pentaho.di.repository.RepositoryMeta; import org.pentaho.di.repository.UserInfo; import org.pentaho.di.trans.StepLoader; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; /** * Java調用Kettle示例代碼 * * */ public class KettleTest { public static void main(String[] args) throws KettleException { String filename = "voucher.ktr"; // callNativeTrans(filename); // executeTrans(); // executeJobs(); callNativeTransWithParam(filename); System.out.println("ok"); } /** * 調用本地的轉換文件 * * @Description: * @param transFileName * @throws KettleException */ public static void callNativeTrans(String transFileName) throws KettleException { // 初始化 EnvUtil.environmentInit(); StepLoader.init(); // 轉換元對象 TransMeta transMeta = new TransMeta(transFileName); // 轉換 Trans trans = new Trans(transMeta); // 執行轉換 trans.execute(null); // 等待轉換執行結束 trans.waitUntilFinished(); } /** * 調用本地的轉換文件(帶參數) * * @Description: * @param transFileName * @throws KettleException */ public static void callNativeTransWithParam(String transFileName) throws KettleException { // 初始化 EnvUtil.environmentInit(); StepLoader.init(); // 轉換元對象 TransMeta transMeta = new TransMeta(transFileName); // 轉換 Trans trans = new Trans(transMeta); String[] params = {}; // 執行轉換 trans.execute(params); // 等待轉換執行結束 trans.waitUntilFinished(); } /** * 執行存儲在數據庫資源庫中的轉換 * * @Description: * @throws KettleException */ public static void executeTrans() throws KettleException { // 初始化 EnvUtil.environmentInit(); StepLoader.init(); // 日誌 LogWriter log = LogWriter.getInstance("TransTest.log", true, LogWriter.LOG_LEVEL_DEBUG); // 用戶 UserInfo userInfo = new UserInfo(); userInfo.setLogin("admin"); userInfo.setPassword("admin"); // 數據庫連接元對象(連接名稱,不必與kettle中配置的保持一致:數據庫類型:連接方式(kettle支持的連接方式):資源庫IP:資源庫實例名:資源庫端口:資源庫用戶名:資源庫用戶密碼) DatabaseMeta connection = new DatabaseMeta("", "Oracle", "Native", "192.168.3.232", "NSDEV", "1521", "nstcsa3441", "671468"); // 資源庫元對象 RepositoryMeta repinfo = new RepositoryMeta(); repinfo.setConnection(connection); // 資源庫 Repository rep = new Repository(log, repinfo, userInfo); // 連接資源庫 rep.connect(""); // 資源庫目錄對象 RepositoryDirectory dir = new RepositoryDirectory(rep); // 轉換元對象 TransMeta transMeta = new TransMeta(rep, "憑證(N9->EVC2)", dir); // 轉換 Trans trans = new Trans(transMeta); // 執行轉換 trans.execute(null); // 等待轉換執行結束 trans.waitUntilFinished(); } /** * 執行本地的任務文件 * * @Description: * @param jobFileName * @throws KettleException */ public static void callNativeJob(String jobFileName) throws KettleException { // 初始化 EnvUtil.environmentInit(); JobEntryLoader.init(); StepLoader.init(); // 日誌 LogWriter log = LogWriter.getInstance("TransTest.log", true, LogWriter.LOG_LEVEL_DETAILED); // job元對象 JobMeta jobMeta = new JobMeta(log, jobFileName, null); // job Job job = new Job(log, StepLoader.getInstance(), null, jobMeta); jobMeta.setInternalKettleVariables(job); // 執行job job.execute(); // 等待job執行結束 job.waitUntilFinished(); } /** * 執行數據庫資源庫中的任務 * * @Description: * @throws KettleException */ public static void executeJobs() throws KettleException { // 初始化 EnvUtil.environmentInit(); JobEntryLoader.init(); StepLoader.init(); // 日誌 LogWriter log = LogWriter.getInstance("TransTest.log", true, LogWriter.LOG_LEVEL_DETAILED); // 用戶 UserInfo userInfo = new UserInfo(); userInfo.setLogin("admin"); userInfo.setPassword("admin"); // 數據庫連接元對象 DatabaseMeta connection = new DatabaseMeta("", "Oracle", "Native", "192.168.3.232", "NSDEV", "1521", "nstcsa3441", "671468"); // 資源庫元對象 RepositoryMeta repinfo = new RepositoryMeta(); repinfo.setConnection(connection); // 資源庫 Repository rep = new Repository(log, repinfo, userInfo); // 連接資源庫 rep.connect(""); // 資源庫目錄對象 RepositoryDirectory dir = new RepositoryDirectory(rep); // 步驟加載對象 StepLoader steploader = StepLoader.getInstance(); // job元對象 JobMeta jobmeta = new JobMeta(log, rep, "4.賬戶每日餘額", dir); // job Job job = new Job(log, steploader, rep, jobmeta); // 執行job job.execute(); // 等待job執行結束 job.waitUntilFinished(); } }
本示例只能實現一次調用,暫時不知道如何通過API設定運行時間,但可以結合Spring和Quartz,設定定時調度,以便實現調度目標。