在java中執行kettle文件

因爲近期項目中須要對接收到文件進行解析,而後存入到數據庫中,因爲數據量較大,加之最近接觸到了kettle,因此就想在項目中來實際使用下。java

先編輯好kettle文件

這裏進行轉換的功能比較簡單,就是從文件中獲取數據,而後進行分割,而後存放到數據庫中。以下圖所示,是最終的kettle文件。數據庫

Java中調用Kettle來執行這個轉換

添加依賴

這裏使用的gradle,須要注意的是maven倉庫的地址,在阿里的倉庫貌似沒找到kettle的包,配置以下:maven

ext {
    kettleVersion = '8.0.0.0-1'
}

repositories {
    mavenLocal()
    maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    maven{ url 'http://nexus.pentaho.org/content/groups/omni' }
}

dependencies {
    compile("pentaho-kettle:kettle-core:${kettleVersion}")
    compile("pentaho-kettle:kettle-engine:${kettleVersion}")
}

一些問題

  1. 因爲這個轉換在執行的時候,有些參數是要經過業務系統中獲取到而後傳入到這裏來的,因此須要考慮這些參數怎麼進行傳遞。
  2. 數據庫的配置也是要經過配置文件中獲取的,不能寫死。

問題解決

針對第一個問題,kettle能夠設置命名參數,而後在執行的時候指定這些參數就能夠。gradle

針對第二個問題,在執行轉換的時候設置數據庫的相關配置就能夠。加密

開始轉換

設置命名參數

獲取到metaData後,而後進行設置就能夠,具體代碼以下:url

TransMeta transMeta = new TransMeta(filename);

Map<String, String> params = new HashMap<String, String>() {{
  put("filePath", filename);
  put("tableName", tableName);
  put("version", String.valueOf(version.getVersion()));
}};

params.forEach((k, v) -> {
  try {
    transMeta.setParameterValue(k, v);
  } catch (UnknownParamException e) {
    e.printStackTrace();
  }
});

設置數據庫配置

在設置數據庫的配置的時候須要注意密碼的加密方式,具體代碼以下:spa

private static final String SEED = "0933910847463829827159347601486730416058";
private static final String PASSWORD_ENCRYPTED_PREFIX = "Encrypted ";

private String getPassword(String dbPass) {
  BigInteger bi_passwd = new BigInteger(dbPass.getBytes());

  BigInteger bi_r0  = new BigInteger(SEED);
  BigInteger bi_r1  = bi_r0.xor(bi_passwd);

  return PASSWORD_ENCRYPTED_PREFIX + bi_r1.toString(RADIX);
}

開始轉換代碼

KettleEnvironment.init();    // 初始化kettle環境

String filename = ResourceUtils.getFile("classpath:etc.ktr").getAbsolutePath();

TransMeta transMeta = new TransMeta(filename);
List<DatabaseMeta> dbList = transMeta.getDatabases();

// TODO 修改數據庫信息

// TODO 設置參數

Trans trans = new Trans(transMeta);

// 設置日誌等級
trans.setLogLevel(LogLevel.ERROR);
trans.execute(null);

trans.waitUntilFinished();
相關文章
相關標籤/搜索