這是我參與8月更文挑戰的第10天,活動詳情查看:8月更文挑戰markdown
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
複製代碼
議程組容許將規則以組的形式,並將這麼組放入堆棧,堆棧具備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 ";
}
複製代碼
激活組要求相同組只執行一個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";
}
複製代碼
流式組支持服務編排,像工做流同樣前後順序運行規則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
複製代碼