器 | 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
複製代碼
相關文章
相關標籤/搜索