一、语法
规则语法:
package: package的名字是随意的,不必必须对应物理路径。
import : 导入外部变量,可以是类或静态方法。
rule: 定义一个规则
rule分为三部分:
1:属性部分:定义当前规则执行的一些属性,比如是否可被重复执行、过期时间、生效时间等。
2:条件部分(LHS):定义当前规则的条件。
3:结果部分(RHS):当前规则条件满足后执行的操作。(可以写JAVA代码)
属性部分:
no-loop : 当前规则是否不允许多次循环执行(默认:false)。
lock-on-active true : 控制当前的规则只会被执行一次。
date-expires:规则的过期时间。
date-effective:规则的生效时间
salience:优先级,数值越大越先执行。
条件部分:
when : 规则条件开始,条件可以单个也可以多个:
when
eval(true)
$customer:Customer()
$message:Message(status==0)
上述三个条件,只有三个条件全部匹配时候才能执行RHS部分:
$message:当前条件的引用变量。
$message:Message(status==0):当前Message对象中的status属性等于0。
Message{
int status;
List<String> names;
}
$message:Message(status==0 && names contains "网易" && names.size >= 1)
比较操作符:
> >= < <= == != contains / not contains / memberOf / not memberOf / matches / not matches
contains : 对比是否包含操作,操作的被包含目标可以是一个复杂对象也可以是一个简单值。
not contains : 与contains相反
memberOf: 判断某个Fact属性值是否在某个集合中,与contains不同的是,它被比较的对象是一个集合。(可以理解为针对集合的contains)
matches: 正则表达式匹配,不用考虑‘/’ 的转义问题
规则结果部分:
当规则条件满足,则进入规则结果执行部分,这部分可以是纯java代码:
then
System.out.println("OK");
end
也可以调用Fact的方法:如$message:execute();
结果部分的方法:
insert : 往当前workingMemory中插入一个新的Fact对象,会触发规则引擎再次执行,除非使用no-loop限定;
update: 更新
modify: 修改,与update语法不同,结果都是更新操作。
retract: 删除
定义方法:
RHS也可以调用规则文件中定义的方法,
function void console{
System.out.println();
SyringUtils.getId();// StringUtils必须import, getId()必须是静态方法
}
定义类:
declare : 可以在规则文件中定义一个class, 使用方法与java对象相似。
可以在RHS部分new一个并且使用get/set方法去操作其属性。
declare Address
@author(sunf) //元数据,仅用于描述信息
@createTime(2017-03-23)
city : String @maxLengh(100)
postno : int
end
定义好一个class后,可以在RHS部分使用new 来定义一个对象。
Address address = new Address();
更对语法:
http://wenku.baidu.com/view/a6516373f242336c1eb95e7c.html
-----------------
no-loop:在DRL的then子句中,如果出现insert、update、modify、retract等方法对实例(Fact)做出修改时,当前规则执行完成后会触发该规则使其再执行一次;将no-loop设置为true则会强制规则在出现上述方法的情况下也只执行一次
boolean型,默认值为false
ruleflow-group:基于ruleflow将规则分组
string型,无默认值
lock-on-active:规则可能会被其它规则调用而反复执行;将lock-on-active置为true可以强制使规则在任何条件下都只会执行一次,可视为no-loop的加强版
boolean型,默认值为false
salience:设置当前这条规则的执行优先级,数字越小优先级越高
int型,默认值为0
agenda-group:基于Agenda将规则分组;只有当某个Agenda组获取到焦点(focus)时,该组的规则才会被执行
string型,默认值为MAIN
auto-focus:与agenda-group配合使用,设置焦点的是否可以自动获取
boolean型,默认值为false
activation-group:不基于任何条件将规则分组
string型,无默认值
dialect:设置规则所使用的语言
string型,默认值根据package值判断,值域为java或mvel
data-effective:当前规则的生效时间
string型,无默认值;值中需包含日期和时间
data-expires:当前规则的失效时间
string型,无默认值;值中需包含日期和时间
duration:设置DRL文件开始执行之后延迟多长时间开始执行这条规则
long型,无默认值

201

被折叠的 条评论
为什么被折叠?



