Drools 7.x 如何动态触发指定规则组并实现嵌套分支逻辑
Drools 7.x 规则实现方案
核心用到的Drools特性
activation-group:同一分组下的规则互斥,仅优先级最高的一个规则会触发agenda-group:只有获得焦点(focus)的分组下的规则才会进入匹配队列,未激活的分组规则不会被匹配- 控制标记Fact:用于关联顶层规则和子分组规则的触发关系,避免无意义的子规则匹配
前置准备
首先定义一个简单的控制标记类(普通POJO即可,强类型更易维护):
public class GroupTriggerFlag { private String groupName; // 构造器、getter、setter方法省略 }
你用到的各个业务变量对应的类直接作为普通Fact插入工作内存即可,Drools支持在规则条件中同时匹配多个不同类型的Fact。
完整DRL规则示例
package com.yourpackage.rules // 导入你用到的业务Fact类和控制标记类 import com.yourpackage.xxx.FactA; // 包含variableA import com.yourpackage.xxx.FactA1; // 包含variableA1 import com.yourpackage.xxx.FactB1; // 包含variableB1 import com.yourpackage.xxx.FactN; // 包含variableN import com.yourpackage.xxx.GroupTriggerFlag; // 顶层规则1和2放在同一个activation-group,保证仅触发一个 rule "rule1" activation-group "top-rule-group" salience 100 // 优先级可根据需要调整,同activation-group下优先级高的先触发 when FactA(variableA == 1) then // 插入group1的触发标记 insert(new GroupTriggerFlag("group1")); // 给group1的agenda-group设置焦点,激活该组规则 kcontext.getAgenda().getAgendaGroup("group1").setFocus(); end rule "rule2" activation-group "top-rule-group" salience 90 when FactA(variableA != 1) then insert(new GroupTriggerFlag("group2")); kcontext.getAgenda().getAgendaGroup("group2").setFocus(); end // ----------------------- group1规则 ----------------------- rule "rule1-1" agenda-group "group1" activation-group "group1-sub-rule" // 同组子规则互斥,仅触发一个 salience 10 when GroupTriggerFlag(groupName == "group1") FactA1(variableA1 == 2) then // 此处写variableA1==2对应的业务逻辑 end rule "rule1-2" agenda-group "group1" activation-group "group1-sub-rule" salience 9 when GroupTriggerFlag(groupName == "group1") FactA1(variableA1 == 3) then // 此处写variableA1==3对应的业务逻辑 end // ----------------------- group2规则 ----------------------- rule "rule2-1" agenda-group "group2" activation-group "group2-sub-rule" salience 10 when GroupTriggerFlag(groupName == "group2") FactB1(variableB1 == 1) then // 此处写variableB1==1对应的业务逻辑 end rule "rule2-2" agenda-group "group2" activation-group "group2-sub-rule" salience 9 when GroupTriggerFlag(groupName == "group2") FactB1(variableB1 == 2) FactN(variableN == 1) then // 此处写variableB1==2且variableN==1对应的业务逻辑 end rule "rule2-2-1" agenda-group "group2" activation-group "group2-sub-rule" salience 8 when GroupTriggerFlag(groupName == "group2") FactB1(variableB1 == 2) FactN(variableN == 2) then // 此处写variableB1==2且variableN==2对应的业务逻辑 end
逻辑说明
上述配置完全满足你的需求:顶层规则1、2互斥仅触发一个,触发后只会激活对应分组的子规则,另一分组的规则完全不会进入匹配队列,同分组的子规则也互斥仅触发一个。不需要修改Drools默认配置,通过代码主动激活分组的逻辑即可生效。
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

