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

Drools规则配置:如何为单个规则设置多个agenda-group实现复用

Drools 单规则绑定多分组实现方案

Drools 原生的 agenda-group 属性不支持直接配置多个分组值,你可以通过以下几种方案实现规则多分组共享的需求:


方案1:规则继承复用(推荐,无侵入)

把公共规则逻辑抽成抽象父规则,不同分组的子规则继承父规则即可实现逻辑复用,同时绑定不同的agenda-group,完全符合Drools原生语法规范:

// 抽离公共逻辑作为抽象父规则
rule "PromotionGlobalTest_Parent"
    enabled true
    salience 0
    dialect "mvel"
    when
        c : Contract( serviceType not in ( 2, 3 ) )
    then
        c.createMessage( "2, 3" );
end

// 绑定global分组的子规则
rule "Row 1 PromotionGlobalTest_Global" extends "PromotionGlobalTest_Parent"
    agenda-group "global"
end

// 绑定group1分组的子规则
rule "Row 1 PromotionGlobalTest_Group1" extends "PromotionGlobalTest_Parent"
    agenda-group "group1"
end

方案2:自定义元标签+规则过滤器

给规则加自定义元数据存储多个分组标识,执行规则时通过自定义过滤器匹配标签即可,不需要拆分规则,灵活度更高:

rule "Row 1 PromotionGlobalTest"
    enabled true
    salience 0
    dialect "mvel"
    // 用元数据存储多个分组标识
    metadata @tags("global", "group1")
    when
        c : Contract( serviceType not in ( 2, 3 ) )
    then
        c.createMessage( "2, 3" );
end

Java 侧执行规则时传入要激活的分组,自定义过滤器匹配规则:

String targetGroup = "group1";
ksession.fireAllRules(new RuleFilter() {
    @Override
    public boolean accept(Rule rule) {
        String[] tags = (String[]) rule.getMetaData().get("tags");
        if (tags == null) return false;
        // 匹配到对应分组就放行执行
        return Arrays.asList(tags).contains(targetGroup);
    }
});

方案3:公共分组批量激活

固定一个全局公共分组global,所有需要多分组共享的规则都绑定该分组,每次执行业务分组前,先把公共分组加入激活队列:

// 执行group1分组时,同时激活global公共分组
Agenda agenda = ksession.getAgenda();
agenda.getAgendaGroup("global").setFocus();
agenda.getAgendaGroup("group1").setFocus();
ksession.fireAllRules();

该方案适合有大量全局公共规则、分组逻辑分层清晰的场景。

内容的提问来源于stack exchange,提问作者Vanessa Nadal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:24:08