Java各种规则引擎
一. Drools规则引擎
1.简介:
Drools就是为了解决业务代码和业务规则分离的引擎。 Drools 规则是在 Java 应用程序上运行的,其要执行的步骤顺序由代码确定 ,为了实现这一点,Drools 规则引擎将业务规则转换成执行树。
2.特性:
优点: 1、简化系统架构,优化应用 2、提高系统的可维护性和维护成本 3、方便系统的整合 4、减少编写“硬代码”业务规则的成本和风险
3.原理:
4.使用方式:
(1)Maven 依赖:
org.kie
kie-api
6.5.0.Final
org.drools
drools-compiler
6.5.0.Final
runtime
junit
junit
4.12
(2)新建配置文件/src/resources/META-INF/kmodule.xml
(3)新建drools规则文件/src/resources/rules/age.drl
import com.lrq.wechatDemo.domain.User // 导入类
dialect "mvel"
rule "age" // 规则名,唯一
when
$user : User(age60) //规则的条件部分
then
System.out.println("年龄不符合要求!");
end
测试用例:
/**
* CreateBy: haleyliu
* CreateDate: 2018/12/26
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:applicationContext.xml"})
public class TestUser {
private static KieContainer container = null;
private KieSession statefulKieSession = null;
@Test
public void test(){
KieServices kieServices = KieServices.Factory.get();
container = kieServices.getKieClasspathContainer();
statefulKieSession = container.newKieSession("myAgeSession");
User user = new User("duval yang",12);
statefulKieSession.insert(user);
statefulKieSession.fireAllRules();
statefulKieSession.dispose();
}
}
二.Aviator表达式求值引擎
1.简介:
Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各 种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎,为什 么还需要Avaitor呢? Aviator的设计目标是轻量级和高性能 ,相比于Groovy、JRuby的笨重,Aviator 非常小,加上依赖包也才450K,不算依赖包的话只有70K;当然,Aviator的语法 是受限的,它不是一门完整的语言,而只是语言的一小部分集合。 其次,Aviator的实现思路与其他轻量级的求值器很不相同,其他求值器一般都 是通过解释的方式运行,而Aviator则是直接将表达式编译成Java字节码,交给 JVM去执行。简单来说,Aviator的定位是介于Groovy这样的重量级脚本语言和 IKExpression这样的轻量级表达式引擎之间。
2.特性:
(1)支持大部分运算操作符,包括算术操作符、关系运算符、逻辑操作符、 正则匹配操作符(=~)、三元表达式?: ,并且支持操作符的优先级和括号强制优 先级,具体请看后面的操作符列表。 (2)支持函数调用和自定义函数。 (3)支持正则表达式匹配,类似Ruby、Perl的匹配语法,并且支持类Ruby的 $digit指向匹配分组。自动类型转换,当执行操作的时候,会自动判断操作数类 型并做相应转换,无法转换即抛异常。 (4)支持传入变量,支持类似a.b.c的嵌套变量访问。 (5)性能优秀。 (6)Aviator的限制,没有if else、do while等语句,没有赋值语句,仅支持逻 辑表达式、算术表达式、三元表达式和正则匹配。没有位运算符
3.整体结构:
4.maven依赖:
com.googlecode.aviator
aviator
${aviator.version}
5.执行方式
执行表达式的方法有两个:execute()、exec();
execute(),需要传递Map格式参数
exec(),不需要传递Map
示例:
/**
* CreateBy: haleyliu
* CreateDate: 2018/12/25
*/
public class Test {
public static void main(String[] args) {
// exec执行方式,无需传递Map格式
String age = "18";
System.out.println(AviatorEvaluator.exec("'His age is '+ age +'!'", age));
// execute执行方式,需传递Map格式
Map map = new HashMap();
map.put("age", "18");
System.out.println(AviatorEvaluator.execute("'His age is '+ age +'!'",
map));
}
}
6.使用方式:
Aviator可以使用两种函数:内置函数、自定义函数
/**
* CreateBy: haleyliu
* CreateDate: 2018/12/25
*/
public class Test {
public static void main(String[] args) {
Map map = new HashMap();
map.put("s1","123qwer");
map.put("s2","123");
System.out.println(AviatorEvaluator.execute("string.startsWith(s1,s2)",map));
}
}
(2)自定义函数
自定义函数要继承AbstractFunction类,重写目标方法。
/**
* CreateBy: haleyliu
* CreateDate: 2018/12/25
*/
public class Test {
public static void main(String[] args) {
// 注册自定义函数
AviatorEvaluator.addFunction(new MultiplyFunction());
// 方式1
System.out.println(AviatorEvaluator.execute("multiply(12.23, -2.3)"));
// 方式2
Map params = new HashMap();
params.put("a", 12.23);
params.put("b", -2.3);
System.out.println(AviatorEvaluator.execute("multiply(a, b)", params));
}
}
class MultiplyFunction extends AbstractFunction{
@Override
public AviatorObject call(Map env, AviatorObject arg1, AviatorObject arg2) {
double num1 = FunctionUtils.getNumberValue(arg1, env).doubleValue();
double num2 = FunctionUtils.getNumberValue(arg2, env).doubleValue();
return new AviatorDouble(num1 * num2);
}
@Override
public String getName() {
return "multiply";
}
}
7.常用操作符的使用
(2)常量和变量
(3)编译表达式
/**
* CreateBy: haleyliu
* CreateDate: 2018/12/25
*/
public class Test {
public static void main(String[] args) {
String expression = "a+(b-c)>100";
// 编译表达式
Expression compiledExp = AviatorEvaluator.compile(expression);
Map env = new HashMap();
env.put("a", 100.3);
env.put("b", 45);
env.put("c", -199.100);
// 执行表达式
Boolean result = (Boolean) compiledExp.execute(env);
System.out.println(result);
}
}
(4) 访问数组和集合
List和数组用list[0]和array[0],Map用map.date
/**
* CreateBy: haleyliu
* CreateDate: 2018/12/25
*/
public class Test {
public static void main(String[] args) {
final List list = new ArrayList();
list.add("hello");
list.add(" world");
final int[] array = new int[3];
array[0] = 0;
array[1] = 1;
array[2] = 3;
final Map map = new HashMap();
map.put("date", new Date());
Map env = new HashMap();
env.put("list", list);
env.put("array", array);
env.put("map", map);
System.out.println(AviatorEvaluator.execute(
"list[0]+':'+array[0]+':'+'today is '+map.date", env));
}
}
(5) 三元比较符
/**
* CreateBy: haleyliu
* CreateDate: 2018/12/25
*/
public class Test {
public static void main(String[] args) {
Map env = new HashMap();
env.put("a", -5);
String result = (String) AviatorEvaluator.execute("a>0? 'yes':'no'", env);
System.out.println(result);
}
}
(6) 正则表达式匹配
/**
* CreateBy: haleyliu
* CreateDate: 2018/12/25
*/
public class Test {
public static void main(String[] args) {
String email = "hello2018@gmail.com";
Map env = new HashMap();
env.put("email", email);
String username = (String) AviatorEvaluator.execute("email=~/([\\w0-8]+)@\\w+[\\.\\w+]+/ ? $1 : 'unknow' ", env);
System.out.println(username);
}
}
(7) 变量的语法糖衣
/**
* CreateBy: haleyliu
* CreateDate: 2018/12/25
*/
public class Test {
public static void main(String[] args) {
User user = new User(1,"jack","18");
Map env = new HashMap();
env.put("user", user);
String result = (String) AviatorEvaluator.execute(" '[user id='+ user.id + ',name='+user.name + ',age=' +user.age +']' ", env);
System.out.println(result);
}
}
/**
* CreateBy: haleyliu
* CreateDate: 2018/12/25
*/
public class User {
private int id;
private String name;
private String age;
public User() {
}
public User(int id, String name, String age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
(8) nil对象[任何对象都比nil大除了nil本身]
nil是Aviator内置的常量,类似java中的null,表示空的值。nil跟null不同的在 于,在java中null只能使用在==、!=的比较运算符,而nil还可以使用>、>=、 、>=、
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!






