器 | Drools-Group

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战markdown

1、Drools-Group

Drools-Group 分为三种类型,分别是activation-group(议程组)ruleflow-group(规则流组),还有agenda-group(激活组)session

/**
*具备相同activation-group属性的规则中只要有一个被执行,其余的规则都再也不执行。
*能够用相似salience之类的属性来实现规则的执行优先级
*/
activation-group
/**
*将规则划分一个的组,而后在规则流当中经过使用ruleflow-group属性的值,从而使用
*对应的规则,该属性会经过流程的走向肯定要执行哪一条规则
*/
ruleflow-group
/**
*Agenda Group 是用来在Agenda基础上对规则进行再次分组。引擎在调用设置了agenda-group
*属性的规则时须要显示的指定某个agenda group 得到focus,不然将不执行此组的规则。
*/
agenda-group
复制代码

2、 Agenda-group

议程组容许将规则以组的形式,并将这么组放入堆栈,堆栈具备push/pop操做,经过SetFocus完成Push操做。app

kieSession.getAgenda().getAgendaGroup("group2").setFocus();
复制代码

议程老是在栈顶执行,当议程组全部的规则执行后,这个议程组会被移除而后执行下一组。less

规则的调用与执行是经过StatelessKieSession或KieSession来实现的,通常的顺序是建立一个StatelessKieSession或KieSession,将各类通过编译的规则添加到session当中,而后将规则当中可能用到的Global对象和Fact对象插入到Session当中,最后调用fireAllRules 方法来触发、执行规则。post

在没有调用fireAllRules方法以前,全部的规则及插入的Fact对象都存放在一个Agenda表的对象当中,这个Agenda表中每个规则及与其匹配相关业务数据叫作Activation,在调用fireAllRules方法后,这些Activation会依次执行,执行顺序在没有设置相关控制顺序属性时(好比salience属性),它的执行顺序是随机的。ui

Agenda Group是用来在Agenda基础上对规则进行再次分组,可经过为规则添加agenda-group属性来实现。agenda-group属性的值是一个字符串,经过这个字符串,能够将规则分为若干个Agenda Group。引擎在调用设置了agenda-group属性的规则时须要显示的指定某个Agenda Group获得Focus(焦点),不然将不执行该Agenda Group当中的规则。url

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 ";
}
复制代码

3、Activation-Group

激活组要求相同组只执行一个spa

该属性将若干个规则划分红一个组,统一命名。在执行的时候,具备相同activation-group 属性的规则中只要有一个被执行,其它的规则都再也不执行。能够用相似salience之类属性来实现规则的执行优先级。3d

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";
}
复制代码

4、Flow-Group

流式组支持服务编排,像工做流同样前后顺序运行规则code

在使用规则流的时候要用到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
复制代码
相关文章
相关标签/搜索