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

Drools lock-on-active配置下规则未触发问题咨询

问题原因及解决方法

核心问题:lock-on-active 与议程组(agenda-group)的交互逻辑

问题出在 lock-on-active 属性阻止了RULE 2在当前活跃的议程组周期内被激活。

Drools中lock-on-active的作用是:当规则所属的议程组处于活跃状态时,该规则不会被激活(即使有新事实满足条件)。你的代码场景里:

  1. RULE 1和RULE 2同属some-group议程组;
  2. RULE 1执行时,some-group处于活跃状态;
  3. RULE 1插入Object后,RULE 2的条件虽然被评估为满足,但lock-on-active的限制导致它无法被加入当前活跃议程组的执行队列。

salience -1仅降低了RULE 2的优先级,不是它不触发的根本原因。

解决方法

可根据需求选择以下任一方案:

方案1:移除RULE 2的lock-on-active属性

如果你的场景需要插入事实后立即触发RULE 2,lock-on-active属于多余限制,直接移除即可:

rule "RULE 2"
    agenda-group "some-group"
    salience -1
    when
        Object( )
    then
        System.out.println("RULE 2 RUN");
end

方案2:将RULE 2放到不同的议程组

若必须保留lock-on-active,可把RULE 2移至另一个议程组,避免同属一个活跃周期:

rule "RULE 2"
    agenda-group "another-group"
    lock-on-active
    salience -1
    when
        Object( )
    then
        System.out.println("RULE 2 RUN");
end

注意:这种情况需要在代码中手动激活another-group议程组,否则规则不会执行。

方案3:用no-loop替代lock-on-active

如果你的初衷是防止RULE 2因自身修改事实重复触发,no-loop更合适——它仅阻止规则因自身操作重新触发,不会影响其他规则触发它:

rule "RULE 2"
    agenda-group "some-group"
    no-loop
    salience -1
    when
        Object( )
    then
        System.out.println("RULE 2 RUN");
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:12:44