drools規則引擎agenda-group關鍵字特別需要注意的一點,agenda-group關鍵字詳解

drools使用的版本是:7.2.0.Final

1. 我的需求場景:根據每次請求的規則分組id,運行不同的規則

2. 技術:使用agenda-group關鍵字區分規則,使用下面這條代碼來focus到不同的規則分組

kieSession.getAgenda().getAgendaGroup(id).setFocus();

3. 發現的問題:其他沒有被focus的規則分組也運行,特別時規則條件中調用的工具方法的日誌都打印出來了

4. 懷疑人生:agenda-group關鍵字沒有用?官方文檔都是騙人的?

5. 排查結果:沒有被focus的規則分組會運行規則條件,不運行規則結果。

6. 詳細說明可能遇到情況,如果一個kieSession有多個規則,每個規則都包含agenda-group關鍵字,且值不完全一樣會出現以下的情況,auto-focus沒有配置的情況。

  • 直接fireAllRules,所有規則會運行一遍條件,也就是when到then中間的部分,不會運行結果,then後的部分。
  • focus某一個agenda-group,所有規則會運行一遍條件,也就是when到then中間的部分,只運行focus規則的結果部分。

7. 我的處理方案:將不同agenda-group的規則放在不同的KieBase中,保證每一個KieSession中只有一個agenda-group的數據。因爲我的條件部分調用了很多工具類,如果都運行一遍會影響效率。

8. 不得不吐槽一下,不運行就不運行了嘛,運行一遍條件是什麼鬼情況,搞得我都懷疑人生了,亂運行規則真的很嚇人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章