我有一个小例子,我希望执行两个规则,但只触发一个(规则 1)。这有什么问题吗? 流口水版本7.74.1 java 8
rule "RULE 1"
agenda-group "some-group"
when
then
insert( new Object( ) );
System.out.println("RULE 1 RUN");
end
rule "RULE 2"
agenda-group "some-group"
lock-on-active
salience -1
when
Object( )
then
System.out.println("RULE 2 RUN");
end
尝试调试谁激活了规则 2,并在堆栈跟踪中看到,haltRuleFiring 上的规则 1 根据规则 2 计算 LHS
工作正常。
lock-on-active
防止规则激活 如果议程组已处于活动状态。 “规则 1”和“规则 2”都位于同一议程组“某个组”中。由于您看到“规则 1”被触发,因此议程组处于活动状态;由于它处于活动状态,因此“规则 2”不会触发。
尚不完全清楚您在这些规则中使用
lock-on-active
或显着性的原因,因此无法建议如何解决它。但如果您因为规则 1 修改了工作记忆而想要触发规则 2,只需删除 lock-on-active
。 (并且也删除显着性,您不需要它,而且通常不是好的做法。)如果您希望规则 1 在议程组重新触发时不重新触发,请将 not( Object() )
添加到条件/when 子句中规则 1.
有关
lock-on-active
的更多信息请参阅这篇 博客文章。它已经很老了(2012 年),但仍然相关并且有示例。