Drools中如何从Excel规则表中设置仅前序规则未触发时执行的默认规则

Drools 规则触发逻辑实现方案
你需要实现的「前3条规则均未触发时才执行第4条兜底规则」的需求,有两种成熟可落地的实现方案:
方案1:标记事实法(适配Excel决策表,配置成本最低)
这是最适合Excel规则表场景的方案,不需要修改规则引擎调用逻辑,只需调整规则配置即可:
- 先定义一个无业务逻辑的标记类,用于记录前序规则的执行状态:
public class RuleTriggerMark { // 默认前3条规则未触发 private boolean firstThreeExecuted = false; public boolean isFirstThreeExecuted() { return firstThreeExecuted; } public void setFirstThreeExecuted(boolean firstThreeExecuted) { this.firstThreeExecuted = firstThreeExecuted; } }
- 初始化Drools会话时,向工作内存中插入一个
RuleTriggerMark的实例 - 给前3条规则配置
salience(优先级)为10(数值越大优先级越高,只要高于第4条规则即可),并在3条规则的动作列(RHS)都添加如下逻辑:
// 获取工作内存中的标记对象,修改状态后更新回工作内存 RuleTriggerMark mark = (RuleTriggerMark) kcontext.getKieRuntime().getObjects(o -> o instanceof RuleTriggerMark).iterator().next(); mark.setFirstThreeExecuted(true); update(kcontext.getKieRuntime().getFactHandle(mark), mark);
- 给第4条规则配置
salience为5(低于前3条),同时在条件列(LHS)新增条件:RuleTriggerMark(firstThreeExecuted == false)
该方案的核心逻辑是优先级高的前3条规则先执行,只要有任意一条触发就会修改标记位,后续优先级低的第4条规则匹配时会读取最新的标记状态,只有标记为未触发时才会执行。
方案2:监听+分组控制(适合复杂规则流场景)
如果你的规则流本身有分组控制需求,可以用agenda-group配合监听器实现:
- 给前3条规则配置
agenda-group为highPriorityGroup,第4条规则配置agenda-group为fallbackGroup - 实现
AgendaEventListener监听器,监听规则执行事件,记录highPriorityGroup分组下是否有规则被触发 - 调用规则时先给
highPriorityGroup设置焦点,执行完该分组所有规则后,判断如果没有规则被触发,再给fallbackGroup设置焦点执行第4条规则
配置注意事项
不要使用activation-group配置,该属性的逻辑是同组内只要有一条规则触发,其余同组规则直接取消激活,不符合你前3条规则可同时触发的需求。
内容的提问来源于stack exchange,提问作者Akhil kumar Amarneni
相关产品推荐
相关产品推荐

