规则引擎Drools使⽤第七篇Drools常见的属性
Drools的⼀些属性
Drools中提供的属性如下表(部分属性):
quintus怎么读
接下来分别写⼀些demo介绍下这些属性的使⽤。
salience属性
salience属性⽤于指定规则的执⾏优先级,取值类型为Integer。数值越⼤越优先执⾏。每个规则都有⼀个默认的执⾏顺序,如果不设置salience属性,规则体的执⾏顺序为由上到下。
看下这个demo:
package testsalience
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
通过控制台可以看到,规则⽂件执⾏的顺序是按照我们设置的salience值由⼤到⼩顺序执⾏的。建议在编写规则时使⽤salience属性明确指定执⾏优先级。
dialect属性
dialect属性⽤于指定当前规则使⽤的语⾔类型,取值为java和mvel,默认值为java。
注:mvel是⼀种基于java语法的表达式语⾔。mvel像正则表达式⼀样,有直接⽀持集合、数组和字符串匹配的操作符。mvel还提供了⽤来配置和构造字符串的模板语⾔。mvel表达式内容包括属性表达式,布尔表达式,⽅法调⽤,变量赋值,函数定义等。
enabled属性
enabled属性对应的取值为true和fal,默认值为true。
⽤于指定当前规则是否启⽤,如果设置的值为fal则当前规则⽆论是否匹配成功都不会触发。
rule "rule_comparison_notMemberOf"
//指定当前规则不可⽤,当前规则⽆论是否匹配成功都不会执⾏
enabled fal
when
ComparisonOperatorEntity(names not memberOf list)
then
System.out.println("规则rule_comparison_notMemberOf触发");
end
no-loop属性
no-loop属性⽤于防⽌死循环,当规则通过update之类的函数修改了Fact对象时,可能使当前规则再次被激活从⽽导致死循环。取值类型为Boolean,默认值为fal。
编写⼀个测试规则:
package testnoloop
import ity.Student
/*
此规则⽂件⽤于测试no-loop属性
*/
rule "rule_noloop"
when
// no-loop true
$student:Student(age == 25)
then
update($student);//注意此处执⾏update会导致当前规则重新被激活
System.out.println("规则rule_noloop触发");
end
测试代码:
KieServices kieServices = ();
KieContainer kieClasspathContainer = KieClasspathContainer();
KieSession kieSession = wKieSession();
Student student = new Student();
student.tAge(25);
//将数据提供给规则引擎,规则引擎会根据提供的数据进⾏规则匹配,如果规则匹配成功则执⾏规则
kieSession.inrt(student);
kieSession.fireAllRules();
kieSession.dispo();
通过控制台可以看到,由于我们没有设置no-loop属性的值,所以发⽣了死循环。接下来设置no-loop的值为true再次测试则不会发⽣死循环。
activation-group属性
activation-group属性是指激活分组,取值为String类型。具有相同分组名称的规则只能有⼀个规则被触发。
编写⼀个测试规则:
package testactivationgroup
/*
此规则⽂件⽤于测试activation-group属性
*/
rule "rule_activationgroup_1"
activation-group "mygroup"
when
then
System.out.println("规则rule_activationgroup_1触发");
end
rule "rule_activationgroup_2"
activation-group "mygroup"
when
then
System.out.println("规则rule_activationgroup_2触发");
end
艾薇儿的婚礼测试发现,上⾯的两个规则因为属于同⼀个分组,所以只有⼀个触发了。同⼀个分组中的多个规则如果都能够匹配成功,具体哪⼀个最终能够被触发可以通过salience属性确定。
agenda-group属性
agenda-group属性为议程分组,属于另⼀种可控的规则执⾏⽅式。⽤户可以通过设置agenda-group来控制规则的执⾏,只有获取焦点的组中的规则才会被触发。
编写测试⽂件:
/*
此规则⽂件⽤于测试agenda-group属性
*/
rule "rule_agendagroup_1"
agenda-group "myagendagroup_1"
when
then
System.out.println("规则rule_agendagroup_1触发");
show是什么意思英语end
rule "rule_agendagroup_2"
agenda-group "myagendagroup_1"
when
then
System.out.println("规则rule_agendagroup_2触发");
end
//========================================================
rule "rule_agendagroup_3"
agenda-group "myagendagroup_2"
when
then
System.out.println("规则rule_agendagroup_3触发");
end
rule "rule_agendagroup_4"
agenda-group "myagendagroup_2"
when
then
System.out.println("规则rule_agendagroup_4触发");
北京雅思报名
end
测试代码:
KieServices kieServices = ();
KieContainer kieClasspathContainer = KieClasspathContainer();
KieSession kieSession = wKieSession();
莫言 蛙 //设置焦点,对应agenda-group分组中的规则才可能被触发
regretfully
kieSession.fireAllRules();
kieSession.dispo();
通过控制台可以看到,只有获取焦点的分组中的规则才会触发。与activation-group不同的是,activation-group定义的分组中只能够有⼀个规则可以被触发,⽽agenda-group分组中的多个规则都可以被触发。
auto-focus属性
auto-focus属性为⾃动获取焦点,取值类型为Boolean,默认值为fal。⼀般结合agenda-group属性使⽤,当⼀个议程分组未获取焦点时,可以设置auto-focus属性来控制。
编写测试⽂件:
rule "rule_agendagroup_1"
agenda-group "myagendagroup_1"
heaven什么意思
when
then
System.out.println("规则rule_agendagroup_1触发");
end
rule "rule_agendagroup_2"
agenda-group "myagendagroup_1"
when
then
System.out.println("规则rule_agendagroup_2触发");
end
//========================================================
rule "rule_agendagroup_3"
agenda-group "myagendagroup_2"
如图所示 英文
auto-focus true //⾃动获取焦点
when
then
System.out.println("规则rule_agendagroup_3触发");
end
rule "rule_agendagroup_4"
agenda-group "myagendagroup_2"
auto-focus true //⾃动获取焦点
when
then
System.out.println("规则rule_agendagroup_4触发");
end
测试:
KieServices kieServices = ();
KieContainer kieClasspathContainer = KieClasspathContainer();
芝麻街KieSession kieSession = wKieSession();
kieSession.fireAllRules();
kieSession.dispo();
运⾏规则发现,设置auto-focus属性为true的规则都触发了。
timer属性
timer属性可以通过定时器的⽅式指定规则执⾏的时间,使⽤⽅式有两种:
⽅式⼀:timer (int: <initial delay> <repeat interval>?)
此种⽅式遵循java.util.Timer对象的使⽤⽅式,第⼀个参数表⽰⼏秒后执⾏,第⼆个参数表⽰每隔⼏秒执⾏⼀次,第⼆个参数为可选。⽅式⼆:timer(cron: <cron expression>)
梦游天姥吟留别翻译
此种⽅式使⽤标准的unix cron表达式的使⽤⽅式来定义规则执⾏的时间。
编写⼀个测试⽂件: