kettle中調用java類


kettle中調用java類

 

       有時須要在kettle調用java類,如:驗證、查詢或自己定義加密等。有時甚至連主要的數據訪問都不那么簡單,如獲取一個存儲文件或使用一個數據庫連接,某些數據源可能封裝在應用程序中,手工使用自己定義的javaclient訪問是唯一的方法。

本文介紹怎樣在kettle中調用java類。演示樣例代碼在這里下載

       注:假設你使用kettle4.0及以上版本號。也你也能夠使用user defined java class 步驟實現。

 

Modified Java ScriptValue 步驟

       關鍵要在kettle中使用ModifiedJava Script Value 步驟。從名稱上看是只運行javascript來實現該步驟,事實上也能夠運行java代碼。為了理解。我們須要知道該步驟使用Rhino javaScript 引擎來實現。使其能夠在jvm中實現javascript,也使其成為可能,讓腳本去訪問java類。為了說明其怎樣實現。讓我們來看一個簡單的轉換演示樣例,使用java去計算某個字段的md5碼。例如以下圖所看到的:

 

       javascript步驟實現md5計算,包括例如以下代碼:

// simulate java imports

varMessageDigest =java.security.MessageDigest;

varString =java.lang.String;

varStringBuffer =java.lang.StringBuffer;

varInteger =java.lang.Integer;

  

// get the md5 digest algorithm

varalgorithm =MessageDigest.getInstance("MD5");

  

// get the input as bytes

varbytes = newString(test_value).getBytes("UTF-8");

  

// calculate the digest

algorithm.reset();

algorithm.update(bytes);

varmd5Digest =algorithm.digest();

  

// turn the digest into a hex-stringrepresentation

varhexString = newStringBuffer();

  

for(vari =0; i < md5Digest.length; i++){

    varhex= Integer.toHexString(0xFF & md5Digest[i]);

    if(hex.length()== 1){

        hexString.append('0');

    }

    hexString.append(hex);

}

  

// write output value

varmd5_hash =hexString.toString().toUpperCase();

       讓我們詳解以上代碼。

       第一部分是就如java 導入包環節,其實和java中import實現相同目的。聲明變量指向java類。是為了避免我們后面引用每一個java類使用完整java長類名帶來不便。當使用自定義的類是,要注意不小心覆蓋了javascript類。javascript也有其自己的Date類實例,稍不在意,使用這樣的方式非常easy覆蓋。

       接着是調用簡單的java API生成md5值,須要指出的是,輸入字段作為javascript對象。“test_value”字段是javascript String對象。有多種方法將其轉換成java String對象,這里使用簡單的構造函數實現。java String的getBytes()方法返回字節數組。

       md5摘要值計算好后。接着通過一小段循環代碼生成表現該值的字符串,最后作為一個新字段寫到輸出行。

 

使用外部jar包中的類

       運行太多的腳步可能影響性能,所以總是把復雜的業務讓編譯好的java代碼來做。一般是一些整潔的實現我們業務的java類庫,有時我們可能自己去創建。kettle現有的功能當然不能滿足我們的全部需求,調用幾個外部類庫能夠避免寫一個完整kettle插件。kettle啟動時載入libext文件夾及子文件夾下全部jar文件。假設你須要訪問自己定義jar包的類,須要放在libext文件里。我們演示樣例是關於MD5,從kettle3.2已經有了對應的jar包(apache commons codec項目)。

codec項目有非常好的方法計算輸入字符串的MD5十六進制字符串,正好是我們須要的;我們只使用DigestUtil類的方法就可以。

//get a nice md5 hash

varmd5_hash = org.apache.commons.codec.digest.DigestUtils.md5Hex(test_value);

在我筆記本上執行新轉換大概10500行/秒,第一版本號的只大概2900行/秒.

兩者的處理速度區別非常大,所以用封裝好的功能似乎真的飛快。當然有可能apache項目採用全然不同的MD5算法實現。

不管如何,后者的實現既簡單又快。

 

結論

Modified Java Script Value 步驟同意訪問不論什么jvm中java類。假設你ETL項目有特定的需求,你已經使用java實現過的需求。這時你能夠考慮使用這樣的方法試試。

當使用腳步代碼總是須要監視性能問題。假設你使用了大量的外部庫。就須要有正確的版本號依賴管理,否則在測試環境或部署環境中會產生問題。

 


免責聲明!

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



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