Drools lock-on-active配置下规则未触发问题咨询
问题原因及解决方法
核心问题:lock-on-active 与议程组(agenda-group)的交互逻辑
问题出在 lock-on-active 属性阻止了RULE 2在当前活跃的议程组周期内被激活。
Drools中lock-on-active的作用是:当规则所属的议程组处于活跃状态时,该规则不会被激活(即使有新事实满足条件)。你的代码场景里:
- RULE 1和RULE 2同属
some-group议程组; - RULE 1执行时,
some-group处于活跃状态; - 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
相关产品推荐
相关产品推荐

