Aviator 5.0 重大更新内容新增了脚本语言 AviatorScrip
以往我们使用规则引擎场景是:java 调用规则引擎,根据规则引擎的处理结果来执行下一步。
Aviator 5.0 打破了这一场景,实现了java代码与规则引擎的相互调用。Aviator 5.0用户手册
这可能会带来一场新的变革
以往我们一套代码应用于多个项目,有些定制化需求可能是通过多个代码分支或者增加系统参数配置来实现的,而最终都是需要修改源代码。 Aviator 5.0 对改变这种模式提供一种可能,不同项目可以共用一个代码分支,通过使用不同的脚本来实现。
闲话少说直接上代码
项目依赖
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.0.0</version>
</dependency>
简单示例
Java 类
package com.test.rule.aviator;
import com.googlecode.aviator.annotation.Function;
import com.googlecode.aviator.annotation.Import;
import com.googlecode.aviator.annotation.ImportScope;
/**
* @ClassName TestUtil
* @Description TODO
* @Author demo
* @Date 2020-04-29 14:57
*/
@Import(ns = "test", scopes = {ImportScope.Static})
public class TestUtil {
@Function(rename = "excute1")
public static int test1(String str){
System.out.println("execute test1:"+str);
return 1;
}
public static int test2(String str){
System.out.println("execute test2:"+str);
return 2;
}
public static int test3(String str){
System.out.println("execute test3:"+str);
return 3;
}
}
Aviator 脚本
if a>0&&a<=1{
return test.excute1("执行方法1");
}
if a>1&&a<3{
return test.test2("执行方法2");
}
if a>=3&&a<6{
return test.test3("执行方法3");
}
return test.excute1("默认执行方法1");
规则执行
package com.test.rule.aviator;
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;
import java.io.IOException;
/**
* @ClassName Demo5
* @Description TODO
* @Author demo
* @Date 2020-04-29 14:59
*/
public class Demo5 {
public static void main(String[]args) throws NoSuchMethodException, IllegalAccessException, IOException {
AviatorEvaluator.importFunctions(TestUtil.class);
Expression exp = AviatorEvaluator.getInstance().compileScript("rule/function2.av");
Object result = exp.execute(exp.newEnv("a", 1));
System.out.println("result: " + result);
result = exp.execute(exp.newEnv("a", 2));
System.out.println("result: " + result);
result = exp.execute(exp.newEnv("a", 5));
System.out.println("result: " + result);
result = exp.execute(exp.newEnv("a", 10));
System.out.println("result: " + result);
}
}
运行结果
execute test1:执行方法1
result: 1
execute test2:执行方法2
result: 2
execute test3:执行方法3
result: 3
execute test1:默认执行方法1
result: 1