theme: channing-cyan
这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
一、Drools-Group
Drools-Group 分为三种类型,分别是activation-group(议程组)
,ruleflow-group(规则流组)
,还有agenda-group(激活组)
。
/** *具有相同activation-group属性的规则中只要有一个被执行,其他的规则都不再执行。 *可以用类似salience之类的属性来实现规则的执行优先级 */ activation-group /** *将规则划分一个的组,然后在规则流当中通过使用ruleflow-group属性的值,从而使用 *对应的规则,该属性会通过流程的走向确定要执行哪一条规则 */ ruleflow-group /** *Agenda Group 是用来在Agenda基础上对规则进行再次分组。引擎在调用设置了agenda-group *属性的规则时需要显示的指定某个agenda group 获得focus,否则将不执行此组的规则。 */ agenda-group
二、 Agenda-group
议程组允许将规则以组的形式,并将这么组放入堆栈,堆栈具有push/pop操作,通过SetFocus完成Push操作。
kieSession.getAgenda().getAgendaGroup("group2").setFocus();
议程总是在栈顶执行,当议程组所有的规则执行后,这个议程组会被移除然后执行下一组。
规则的调用与执行是通过StatelessKieSession或KieSession来实现的,一般的顺序是创建一个StatelessKieSession或KieSession,将各种经过编译的规则添加到session当中,然后将规则当中可能用到的Global对象和Fact对象插入到Session当中,最后调用fireAllRules 方法来触发、执行规则。
在没有调用fireAllRules方法之前,所有的规则及插入的Fact对象都存放在一个Agenda表的对象当中,这个Agenda表中每一个规则及与其匹配相关业务数据叫做Activation,在调用fireAllRules方法后,这些Activation会依次执行,执行顺序在没有设置相关控制顺序属性时(比如salience属性),它的执行顺序是随机的。
Agenda Group是用来在Agenda基础上对规则进行再次分组,可通过为规则添加agenda-group属性来实现。agenda-group属性的值是一个字符串,通过这个字符串,可以将规则分为若干个Agenda Group。引擎在调用设置了agenda-group属性的规则时需要显示的指定某个Agenda Group得到Focus(焦点),否则将不执行该Agenda Group当中的规则。
public void excuteAgendaGroup(){ KieBase kieBase = KieStarter.newKieBase(getAgendaGroupDrl()); KieSession kieSession = kieBase.newKieSession(); //group2 后执行 kieSession.getAgenda().getAgendaGroup("group2").setFocus(); //group1 先执行 kieSession.getAgenda().getAgendaGroup("group1").setFocus(); kieSession.fireAllRules(); kieSession.dispose(); } private String getAgendaGroupDrl(){ return "rule "test-agenda-group1" " + "agenda-group "group1" " + "when then System.out.println("test-agenda-group1-1 被触发"); " + "end " + "rule "test-agenda-group2" " + "agenda-group "group2" " + "when " + "then " + "System.out.println("test-agenda-group2 被触发"); end\n" + "rule "test-agenda-group3" " + "agenda-group "group1" " + "when then System.out.println("test-agenda-group1-2 被触发"); " + "end "; }
三、Activation-Group
激活组要求相同组只执行一个
该属性将若干个规则划分成一个组,统一命名。在执行的时候,具有相同activation-group 属性的规则中只要有一个被执行,其它的规则都不再执行。可以用类似salience之类属性来实现规则的执行优先级。
public void executeActivationGroup(){ KieBase kieBase = KieStarter.newKieBase(getActivationGroupDrl()); KieSession kieSession = kieBase.newKieSession(); kieSession.fireAllRules(); } private String getActivationGroupDrl(){ return "rule "test-activation-group1" " + "salience 1"+ "activation-group "group1" " + "when then System.out.println("test-activation-group1 被触发"); " + "end " + "rule "test-activation-group2" " + "salience 2"+ "activation-group "group1" " + "when " + "then " + "System.out.println("test-activation-group2 被触发"); end\n"; }
四、Flow-Group
流式组支持服务编排,像工作流一样先后顺序运行规则
在使用规则流的时候要用到ruleflow-group属性,该属性的值为一个字符串,作用是将规则划分为一个个的组,然后在规则流当中通过使用ruleflow-group属性的值,从而使用对应的规则。该属性会通过流程的走向确定要执行哪一条规则。在规则流中有具体的说明。
rule "test-ruleflow-group1" ruleflow-group "group1" when then System.out.println("test-ruleflow-group1 被触发"); end rule "test-ruleflow-group2" ruleflow-group "group1" when then System.out.println("test-ruleflow-group2 被触发"); end