规则文件的基本组成部分

// 包名,类似java类的package,但区别在于该处的包名并不一定非要与文件所属路径一致
package packageName
// 导入依赖的class,与java类中的import用法一致
import importClass
// 全局变量,可选项,类似java类中属性的定义(global 全局变量类型 全局变量名)
global globalType globalName
// 规则体,ruleName为规则名称,若为连续字符可不加双引号,可支持中文
rule "ruleName"
// 规则属性,可选项
attributes
when
// 条件部分
LHS
then
// 结果部分,即满足条件后执行的内容
RHS
end

示例:

package rules

rule 规则示例
when
i:Integer(value == 1)
then
System.out.println("hello word");
end

when部分

比较操作符

符号 说明
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
contains 检查一个Fact对象的某个属性值是否包含一个指定的对象值
not contains 检查一个Fact对象的某个属性值是否不包含一个指定的对象值
memberOf 判断一个Fact对象的某个属性是否在一个或多个集合中
not memberOf 判断一个Fact对象的某个属性是否不在一个或多个集合中
matches 判断一个Fact对象的属性是否与提供的标准的Java正则表达式进行匹配
not matches 判断一个Fact对象的属性是否不与提供的标准的Java正则表达式进行匹配

前面种与java中使用方式一致,后六种的语法如下示例:

rule 规则示例
when
user:User(roles contains "管理员")
user:User(roles not contains "管理员")
user:User("管理员" memberOf roles)
user:User("管理员" not memberOf roles)
user:User(name matches "正则表达式")
user:User(name not matches "正则表达式")
then
System.out.println("规则示例");
end

多条件

可以使用andor&&||,,其中,表示与,注意使用时,不要混合使用。
示例:

rule 规则示例
when
user:User(name == "张三" && age >= 18)
then
System.out.println("规则示例:");
end

循环集合

关键字from

rule 规则示例
when
list:ArrayList()
user:User() from list
then
System.out.println(user.getName());
end

集合中的所有对象均需要满足某些条件

关键字forall

rule 规则示例
when
list:ArrayList()
forall(user:User(age >= 18) from list)
then
System.out.println("规则示例:所有User都需要满足年龄大于等于18");
end

集合中找出满足条件的放入新集合中

关键字collect

rule 规则示例
when
list:ArrayList()
user:User(age >= 18) from list
newList:ArrayList() from collect(User(age >= 18) from list)
then
System.out.println("规则示例:所有User都需要满足年龄大于等于18");
end

then部分

支持java代码,格式同java代码一致。

另外drools有内置方法可以使用:updateinsertretract,注:使用内置方法时,会导致规则的重新匹配。

update(更新)

在不同的规则中修改了对象的属性,若不使用update,则相互之间无法读取到修改后的属性值。
使用update方法后,其他规则中则可以读取到当前规则修改的属性值。

insert(新增)

向工作空间中新增新的数据。

retract(删除)

删除工作空间中的数据。

全局变量

global Integer count

attributes部分

属性名 属性可选值 属性说明
salience 数值类型,如:1,2,3 指定规则执行优先级,数值越大越优先执行,不指定时默认按照在文件中的顺序执行
dialect java/mvel 指定规则使用的语言类型,取值为java和mvel,默认为java
enabled true/false 指定规则是否启用,默认为true,可通过指定false暂不启用
date-effective 时间字符串,如:”2021-06-15 12:00:00” 指定规则生效时间,例如限时优惠活动时使用,注:使用时需要传入日期格式,且一定要与规则中的格式一致
date-expires 时间字符串,如:”2021-06-15 13:00:00 指定规则失效时间,例如限时优惠活动时使用
activation-group 分组字符串 激活分组,具有相同分组名称的规则只能有一个规则触发
agenda-group 分组字符串 议程分组,只有获取焦点的组中的规则才有可能触发
auto-focus true/false 自动获取焦点,一般结合agenda-group一起使用
no-loop true/false 不循环调用,默认为false,若使用了内置方法导致规则重新匹配,可能导致某一个规则无限执行,此时可以设置该值为true
timer 方式1(从int1秒后开始每int2秒执行一次):timer (int1, int2);方式2:timer (cron:cron表达式) 定时器,指定规则触发的时间

自定义函数function

function类似java代码中的方法,语法如下:

function 返回值类型 函数名(可选参数){
//逻辑代码
}

示例:

function void f1(){
System.out.println("f1");
}

function void f2(String str){
System.out.println("f1:" + str);
}

function String f3(){
return "f3";
}

function String f4(String str){
return "f4:" + str;
}

查询query

查询只存在LHS部分,即在工作空间中查找符合条件的对象,语法如下:

query 查询的名称(可选参数)
LHS
end

示例:

query 查询成年人
user:User(age >= 18)
end

query 查询固定名字的人(String sname)
user:User(name == sname)
end