You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:45:00