標籤:
我是做工作流程項目的,工作流程中各個模板引擎都需要要執行一個動態業務,這些動態業務有多種實現方式,最常用的就是使用者自己寫一段指令檔,然後工作流程引擎執行到這裡的時候,運行這個指令檔。
這個運行指令檔的功能最初項目組是用ScriptEngineManager實現的。要求使用者提供一個實現業務的jar,並寫js指令碼,指令碼裡動態地調用java內建在js引擎裡的幾個函數,這幾個函數就是動態地調用jar裡面的業務函數。
但是這樣做太不方便,一是js無法調用java代碼,只能預置java函數,或者通過預置的java函數反射其他業務函數。同時js文法對於java程式員也太晦澀了,作為java程式員,很多對js文法不夠瞭解,甚至是誤解的。
於是js這個方式我們就棄用了,現在準備使用Groovy這門語言來做指令碼。
Groovy相信java開發人員都聽說過,畢竟是java的兄弟語言,他和java一樣都是基於jvm這個中介軟體的語言,關係可以類比c#.net和vb.net。和Groovy相同的基於jvm的語言也有很多,這裡就不展開了。
那麼使用Groovy有什麼好處呢?
1.首先需求是要求使用動態指令碼語言,調用java寫的類庫,因此語言最好是動態,這樣可以寫得更少的代碼,對於指令碼也有來說代碼長度至關重要。Groovy就是這樣一個動態語言,有閉包以及其他動態語言中的特性。這些特性我不是特別看重,主要是他的集合對象調用非常簡單,[]可以視為list對象,{}可以視為map對象,同時是弱類型的,你不需要像使用java一樣在類型轉換上花很多時間。這些對於指令碼語言來說太重要了。畢竟指令碼語言只是組織和調用java寫的業務,自己不做業務,所以不需要太好的可維護性,但是需要足夠靈活能夠簡單高效地調用業務函數。
2.Groovy幾乎支援java的所有文法,你可以把他直接當做java來用,這樣對於java工程師而言無疑是福音,如果你拒絕使用Groovy的動態特性,你完全可以唯寫java代碼,完全把他當java來用。
3.Groovy能直接調用java現有的類,也就是說你可以直接使用某個jar提供的類庫,這一點對於我們來說太重要了,直接new業務函數類,就可以調用jar裡面的業務介面了。
為了測試Groovy是否能完成以上需求,我做了一個測試demo。
首先定義一個java類,充當業務jar。
public class JavaFunction {public static int i = 0;public String run() {return "運行了java代碼";}}
然後直接GroovyShell測試指令碼
import groovy.lang.Binding;import groovy.lang.GroovyShell;public class GroovyScriptEngineTest {public static void main(String[] args) throws Exception {Binding binding = new Binding();binding.setVariable("javaFunction", new JavaFunction());GroovyShell gs = new GroovyShell(binding);Object value = gs.evaluate(//可以引入java類"import com.zrsoft.groovyScriptEngineTest.JavaFunction;"+ "println ‘Groovy可以直接import當前classpath裡的類!‘;"//可以寫Groovy文法的代碼。Groovy是動態語言,比java適合寫指令碼+ "println ‘運行了Groovy代碼!‘;"//可以使用java風格的Groovy,其實就是java代碼,因為Groovy支援java+ "String javaCode = \"運行了Java風格的Groovy代碼!\";"+ "System.out.println(javaCode);"//可以直接建立java自訂的對象+ "JavaFunction newJavaFunction = new JavaFunction();"+ "println \"在Groovy引擎裡建立java對象,並\" + newJavaFunction.run();"//可以呼叫指令碼預設的java對象+ "return javaFunction.run();");System.out.println("為GroovyShell預設java對象,並在Groovy裡" + value + ",同時證明Groovy可以返回變數給java。");}}
以上測試全部通過
Groovy可以直接import當前classpath裡的類!運行了Groovy代碼!運行了Java風格的Groovy代碼!在Groovy引擎裡建立java對象,並運行了java代碼為GroovyShell預設java對象,並在Groovy裡運行了java代碼,同時證明Groovy可以返回變數給java。
當然以上測試完成,還不足以讓我們確定使用Groovy做指令碼方案可行,運行效能和運行後記憶體釋放情況還需進一步考察。
用Groovy構建java指令碼