在Java中使用groovy語(yǔ)言作為動(dòng)態(tài)規(guī)則表達(dá)式
由于在工作流設(shè)計(jì)中需要為條件分支設(shè)定條件表達(dá)式,所以需要可以動(dòng)態(tài)執(zhí)行的語(yǔ)言腳本作為工作流的規(guī)則引擎.工作流條件分支純粹使用sql腳本肯定是不行的,經(jīng)過(guò)試驗(yàn),groovy的腳本可以返回為java接受的變量.在具體的工作流實(shí)現(xiàn)中,我們既可以把groovy的腳本單獨(dú)存放在文本文件,也可以將腳本直接存放在數(shù)據(jù)庫(kù)中,在使用的時(shí)候再取出來(lái),當(dāng)然,可可以放在xml文件中.
以下是java調(diào)用groovy腳本的實(shí)例:
- package org.openjweb.core.groovy.test;
- import groovy.lang.GroovyClassLoader;
- import java.io.File;
- public class InvokeGroovy {
- public static void main(String[] args) {
- ClassLoader cl = new InvokeGroovy().getClass().getClassLoader();
- GroovyClassLoader groovyCl = new GroovyClassLoader(cl);
- try
- {
- //從文件中讀取
- //Class groovyClass = groovyCl.parseClass(new File("D:/project/openjweb/src/java/org/openjweb/groovy/Foo.groovy"));
- //直接使用Groovy字符串,也可以獲得正確結(jié)果
- //Class groovyClass = groovyCl.parseClass("package org.openjweb.groovy; \r\n import org.openjweb.core.groovy.test.IFoo;\r\n class Foo implements IFoo {public Object run(Object foo) {return 23}}");
- Class groovyClass = groovyCl.parseClass("package org.openjweb.groovy; \r\n import org.openjweb.core.groovy.test.IFoo;\r\n class Foo implements IFoo {public Object run(Object foo) {return 2+2>1}}");//這個(gè)返回true
- IFoo foo = (IFoo) groovyClass.newInstance();
- System.out.println(foo.run(new Integer(2)));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
下面是Foo.groovy的文本:
- package org.openjweb.groovy;
- import org.openjweb.core.groovy.test.IFoo;
- class Foo implements IFoo
- {
- public Object run(Object foo)
- {
- return 3+2
- }
- }
從上面的代碼看出,可以直接執(zhí)行字符串的groovy腳本,運(yùn)行后返回運(yùn)算結(jié)果,例如2+2>1會(huì)返回true.
使用Groovy或 Jruby動(dòng)態(tài)語(yǔ)言腳本作為規(guī)則引擎解決方案將會(huì)越來(lái)越普及.