1. 概述
* 规则引擎核心思想:将应用程序中的业务决策部分分离出来
* 使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效
2. 执行流程
drools规则引擎由以下三部分构成:
Working Memory(工作内存)
Rule Base(规则库)
Inference Engine(推理引擎)其中Inference Engine(推理引擎)又包括:
Pattern Matcher(匹配器) 具体匹配哪一个规则,由这个完成
Agenda(议程)
Execution Engine(执行引擎)
3. Drools基础语法
3.1 规则文件
在使用Drools时非常重要的一个工作就是编写规则文件,通常规则文件的后缀为.drl
3.2 语法结构
* 规则体语法结构 开始位置 rule,结束位置 end
* 结构组成:
rule "ruleName"
attributes
when
LHS
then
RHS
end
rule:关键字,表示规则开始,参数为规则的唯一名称。
attributes:规则属性,是rule与when之间的参数,为可选项。
when:关键字,后面跟规则的条件部分。
LHS(Left Hand Side):是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。 (左手边)
then:关键字,后面跟规则的结果部分。
RHS(Right Hand Side):是规则的后果或行动部分的通用名称。 (右手边)
end:关键字,表示一个规则结束。
3.3 模式匹配
rule "rule_1"
when
$order:Order(amout >100 && amout < 500)
then
$order.setScore(100);
System.out.println("成功匹配到规则二:100元 - 500元 加100分");
end
3.4 内置方法
Drools提供了一些方法可以用来操作工作内存中的数据,**操作完成后规则引擎会重新进行相关规则的匹配,**原来没有匹配成功的规则在我们修改数据完成后有可能就会匹配成功了。
修改 update方法
update方法的作用是更新工作内存中的数据,并让相关的规则重新匹配。参数:
//Fact对象,事实对象 Order order = new Order(); order.setAmout(30);
规则:
rule "order_rule_1" when $order:Order(amout < 100) then $order.setAmout(150); update($order) System.out.println("成功匹配到规则一:100元以下 不加分"); end rule "order_rule_2" when $order:Order(amout >= 100 && amout < 500) then $order.setScore(100); System.out.println("成功匹配到规则二:100元 - 500元 加100分"); end
添加 insert方法
insert方法的作用是向工作内存中插入数据,并让相关的规则重新匹配
rule "order_rule_1" when $order:Order(amout < 100) then Order order = new Order(); order.setAmout(150); insert(order); System.out.println("成功匹配到规则一:100元以下 不加分"); end rule "order_rule_2" when $order:Order(amout >= 100 && amout < 500) then $order.setScore(100); System.out.println("成功匹配到规则二:100元 - 500元 加100分"); end
删除 retract方法
retract方法的作用是删除工作内存中的数据,并让相关的规则重新匹配。
//规则一:100元以下 不加分 rule "order_rule_1" when $order:Order(amout < 100) then retract($order) //retract方法的作用是删除工作内存中的Fact对象,会导致相关规则重新匹配 System.out.println("成功匹配到规则一:100元以下 不加分"); end
4. Drools规则属性
4.1 salience属性
salience属性用于指定规则的执行优先级,取值类型为Integer。数值越大越优先执行
没有添加执行优先级,执行由上到下执行
package com.order
rule "rule_1"
salience 9
when
eval(true)
then
System.out.println("规则rule_1触发");
end
rule "rule_2"
salience 10
when
eval(true)
then
System.out.println("规则rule_2触发");
end
rule "rule_3"
salience 8
when
eval(true)
then
System.out.println("规则rule_3触发");
end
4.2 no-loop属性
no-loop属性用于防止死循环
//订单积分规则
package com.order
import com.atguigu.drools.model.Order
//规则一:100元以下 不加分
rule "order_rule_1"
no-loop true //防止陷入死循环
when
$order:Order(amout < 100)
then
$order.setScore(0);
update($order)
System.out.println("成功匹配到规则一:100元以下 不加分");
end
5. Drools高级语法
global关键字用于在规则文件中定义全局变量,它可以让应用程序的对象在规则文件中能够被访问。
语法结构为:global 对象类型 对象名称
//订单积分规则
package com.order
import com.atguigu.drools.bean.Order1
global com.atguigu.drools.bean.Integral integral;
//规则一:100元以下 不加分
rule "order_rule_1"
no-loop true //防止陷入死循环
when
$order:Order1(amout < 100)
then
integral.setScore(10);
update($order)
System.out.println("成功匹配到规则一:100元以下 不加分");
end