在以下规则中,我希望首先对每个clazz1执行rule1,并且只有在满足该条件时,才需要执行其他规则(由于lock-on-active)
但是,在执行rule1之后,流口水正在执行
Rule1,rule2,rule3和
rule2,rule3,然后返回到rule1。
您能否建议我的配置不正确?
rule "rule1"
ruleflow-group "validate_precondition"
when
$clazz1 : Clazz1 ( isPreConditionSatisfied() )
then
drools.setFocus("validate1");
end
rule "rule2"
agenda-group "validate1"
lock-on-active true
when
$clazz1 : Clazz1 ( !isCheck1(type) )
then
System.out.println("inside check1");
end
rule "rule3"
agenda-group "validate1"
lock-on-active true
when
$clazz1 : Clazz1 ( !isCheck2(type) )
then
System.out.println("inside check2");
end
最佳答案
从Drools手册中:
每当规则流组变为活动状态或议程组收到
焦点,该组中任何将活动锁定设置为
当议程小组失败时,将不会再激活true ...
那些将活动锁定设置为true的规则变得合格
再次将其激活列入议程。
因此,假设您的每个规则都位于不同的议程组中,并且每次激活规则后都将焦点转移到其他位置,那么使用主动锁定功能将无法实现任何目的。
用您的话来说,听起来规则引擎正在多次激活。假设它不是在无限循环中循环,我希望这是由于工作内存中有多个Clazz1实例。
如果它在无限循环中循环,那么我可能会猜到上面的代码不是您正在执行的代码。在这些情况下,无限循环往往是由更新事实而不使用“无循环”的规则引起的。
补充说明-您应该认真考虑重新执行命令以执行这些规则是否适当。至少对于上面的示例,似乎没有充分的理由这样做。