最近,了解一下规则引擎,似乎名气比较大的规则引擎不多,也就是 JBoss的Drools 和 Apache 的Camel 。相对于其它品类的开源软件来说,规则引擎似乎不是很旺盛。
在了解Activiti 的时候,可以使用Groovy写一些规则,因此了解了一下Groovy。
Groovy 是一种用于 Java 虚拟机的 动态语言,它是面向对象的,既可以面向对象编程,也可以用作脚本语言。它可以和Java互相调用。
下面是一个简单的规则实现,使用java实现具体行为,Groovy实现判断逻辑。
Java 行为部分
Java 接口
public interface Fruit{
public String getName();
public String Type();
public void show();
}
对以上接口的2个实现类
public class Apple implements Fruit{
public String getName(){
return "java apple";
}
public String getType(){
return "apple";
}
public void show(){
System.out.println("Show: I am a Java Apple");
}
}
public class Orange implements Fruit {
public String getName(){
return "java orange";
}
public String getType(){
return "orange";
}
public void show(){
System.out.println("Show: I am a java orange.");
}
}
下面是Groovy部分。
1 、Groovy 实现java接口的方式:
用于Groovy的Java 接口
public interface GroovyController {
public void controllFruit(Fruit fruit);
}
Groovy 的实现,另存为文件(GroovyClass.groovy),文件扩展名为 .groovy
import java.lang.String;
class GroovyClass implements GroovyController{
public void controllFruit(Fruit fruit){
fruit.show()
if (fruit.getType() == "apple"){
println 'groovy apple'
}
if (fruit.getType() == "orange"){
println 'groovy orange';
}
println 'END'
}
}
Java load Groovy 文件,实例化 Groovy的对象,并运行。
代码片段 ,groovy文件存于D盘根下。
public static void testGroovyClass(){
ClassLoader loader = new GroovyManager().getClass().getClassLoader();
GroovyClassLoader gLoader = new GroovyClassLoader(loader);
Fruit apple = new Apple();
Fruit orange = new Orange();
try {
Class groovyClass = gLoader.parseClass(
new File("D:/GroovyClassDisk.groovy"));
GroovyController controller = (GroovyController)groovyClass.newInstance();
controller.controllFruit(apple);
controller.controllFruit(orange);
System.out.println("run groovy class end");
System.out.println("another way to run groovy class with directly invoking method ");
GroovyObject gobject = (GroovyObject)groovyClass.newInstance();
gobject.invokeMethod("controllFruit", apple);
gobject.invokeMethod("controllFruit", orange);
System.out.println("end to running groovy class ");
} catch (CompilationFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
结果:
Show: I am a java apple.
disk groovy apple
END
Show: I am a java orange.
disk groovy orange
END
run groovy class end
another way to run groovy class with directly invoking method
Show: I am a java apple.
disk groovy apple
END
Show: I am a java orange.
disk groovy orange
END
end to running groovy class
2、Groovy Script的方式
Groovy Script:
fruit.show()
if (fruit.getType() == "apple"){
println 'script groovy apple'
}
if (fruit.getType() == "orange"){
println 'script groovy orange'
}
println 'END'
Java load Groovy script and run
public static void testGroovyScript(){
Fruit apple = new Apple();
Fruit orange = new Orange();
String scriptText = null;
try {
scriptText = FileUtils.readFileToString(new File("d:/GroovyScript.groovy"));
} catch (IOException e) {
e.printStackTrace();
}
// Using Script engine
ScriptEngineManager manager = new ScriptEngineManager(GroovyManager.class.getClassLoader());
ScriptEngine scriptEng = manager.getEngineByName("Groovy");
try {
scriptEng.put("fruit", apple);
scriptEng.eval(scriptText);
scriptEng.put("fruit", orange);
scriptEng.eval(scriptText);
} catch (ScriptException e) {
e.printStackTrace();
}
System.out.println("ending using Script engine");
System.out.println("Begin to use Groovy bind");
Binding bind = new Binding();
GroovyShell gs = new GroovyShell(bind);
bind.setProperty("fruit", apple);
gs.evaluate(scriptText);
bind.setProperty("fruit", orange);
gs.evaluate(scriptText);
System.out.println("end to use Groovy bind");
}
结果:
Show: I am a java apple.
script groovy apple
END
Show: I am a java orange.
script groovy orange
END
ending using Script engine
Begin to use Groovy bind
Show: I am a java apple.
script groovy apple
END
Show: I am a java orange.
script groovy orange
END
end to use Groovy bind
以上为简单的例子。似乎可以实现规则引擎的一些功能。而且 Groovy也不难用。上面例子中的文件都没有路径,如果加上路径的话,
Groovy的编写使用跟java相同的import,要让groovy代码中能够找到java类的路。在此记录一下。