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

Drools 6.4.0升级至7.0.0后规则执行顺序异常问题问询

Drools 6.4.0 升级到7.0.0后规则执行顺序变化的原因

问题场景

现有两条未设置salience的规则:

rule "My First Rule"
when
    Conditions for first rule
    Not routed yet
then
    Route to "First".
end

rule "My Second Rule"
when
    Conditions for second rule
    Not routed yet
then
    Route to "Second".
end

当两条规则均满足匹配条件时:

  • Drools 6.4.0 执行第二条规则
  • Drools 7.0.0 执行第一条规则

初始化代码仅替换了会话类(StatelessKnowledgeSession → StatelessKieSession),其余逻辑一致。

版本间核心行为变更

1. 规则议程排序逻辑的明确化

Drools 6.x中,未设置salience的规则执行顺序依赖规则的加载/定义顺序,通常后加载的规则会被优先激活执行(这也是你6.4.0中第二条规则先执行的原因)。

而Drools 7.x对规则议程的排序逻辑做了重构:当多条规则的salience值相同时(默认都是0),会**按照规则名称的字典序(lexicographical order)**来确定执行优先级。你的两条规则中,"My First Rule"的字典序早于"My Second Rule",因此7.0.0中会先执行第一条。

2. Kie架构带来的隐性变化

Drools 7.x全面切换到Kie(Knowledge Is Everything)架构,虽然你的代码看起来只是会话类的替换,但内部的规则编译、知识包管理、议程激活机制都有重构,规则的排序不再依赖6.x中基于知识包加载顺序的隐性逻辑,而是统一使用字典序作为salience相同时的排序依据。

3. 默认salience的行为补充

两者默认salience值均为0,但7.x明确了salience相同时的排序规则,而6.x的排序行为没有统一规范,可能因加载顺序、文件解析顺序出现波动。

解决方案

  • 显式设置salience(推荐):如果需要固定规则执行顺序,直接给规则添加salience属性,数值越高优先级越高。比如给第二条规则设置更高的优先级:
    rule "My Second Rule"
        salience 10
    when
        Conditions for second rule
        Not routed yet
    then
        Route to "Second".
    end
    
  • 自定义议程排序策略:如果要兼容6.x的加载顺序逻辑,可以通过配置KieBase的AgendaGroup或自定义AgendaFilter来调整排序,但这种方式依赖内部实现,不如显式设置salience稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:44:58