在下面的规则中,我希望首先为每个clazz1执行rule1,并且只有在满足时才需要执行其他规则(因为锁定活动)
但是,执行rule1后,drools正在执行 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
答案 0 :(得分:1)
来自Drools手册:
每当规则流组变为活动状态或议程组接收时 焦点,该组中具有锁定活动设置的任何规则 当议程小组失败时,将不会再激活true 将lock-on-active设置为true的那些规则的重点变为合格 再次将他们的激活提上日程。
因此,鉴于您的每个规则都在不同的议程组中,并且您在每次激活规则后都在改变焦点,使用锁定活动将无法实现任何目标。
根据您的说法,这听起来像规则引擎多次激活。假设它没有在无限循环中循环,我希望这是由于工作内存中有多个Clazz1实例。
如果它在无限循环中循环,那么我会猜测上面的代码不是你正在执行的代码。在这些情况下的无限循环往往是由更新事实的规则引起的,而不使用“无循环”。
另外一个注意事项 - 您应该认真考虑是否适合执行这些规则的执行。至少在上面的例子中,似乎没有充分的理由这样做。