规则引擎Drools语法整理
规则文件的基本组成部分
// 包名,类似java类的package,但区别在于该处的包名并不一定非要与文件所属路径一致 |
示例:
package rules |
when部分
比较操作符
| 符号 | 说明 |
|---|---|
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| == | 等于 |
| != | 不等于 |
| contains | 检查一个Fact对象的某个属性值是否包含一个指定的对象值 |
| not contains | 检查一个Fact对象的某个属性值是否不包含一个指定的对象值 |
| memberOf | 判断一个Fact对象的某个属性是否在一个或多个集合中 |
| not memberOf | 判断一个Fact对象的某个属性是否不在一个或多个集合中 |
| matches | 判断一个Fact对象的属性是否与提供的标准的Java正则表达式进行匹配 |
| not matches | 判断一个Fact对象的属性是否不与提供的标准的Java正则表达式进行匹配 |
前面种与java中使用方式一致,后六种的语法如下示例:
rule 规则示例 |
多条件
可以使用and、or、&&、||、,,其中,表示与,注意使用时,不要混合使用。
示例:
rule 规则示例 |
循环集合
关键字from
rule 规则示例 |
集合中的所有对象均需要满足某些条件
关键字forall
rule 规则示例 |
集合中找出满足条件的放入新集合中
关键字collect
rule 规则示例 |
then部分
支持java代码,格式同java代码一致。
另外drools有内置方法可以使用:update,insert,retract,注:使用内置方法时,会导致规则的重新匹配。
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(){ |
查询query
查询只存在LHS部分,即在工作空间中查找符合条件的对象,语法如下:
query 查询的名称(可选参数) |
示例:
query 查询成年人 |