0

在下面的规则中,我希望每个 clazz1 首先执行 rule1,并且只有满足,才需要执行其他规则(因为 lock-on-active )

但是在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
4

1 回答 1

1

来自 Drools 手册:

每当规则流组变为活动或议程组收到焦点时,该组中将 lock-on-active 设置为 true 的任何规则都将不再被激活......当议程组失去焦点时,这些规则将 lock-on-active 设置为 true 再次有资格将其激活放入议程中。

因此,鉴于您的每条规则都位于不同的议程组中,并且您在每次规则激活后都在改变焦点,因此使用 lock-on-active 不会取得任何成果。

从您所说的来看,听起来规则引擎正在多次激活。假设它不是在无限循环中循环,我预计这是由于工作内存中存在多个 Clazz1 实例。

如果它在无限循环中循环,那么我会冒险猜测上面的代码不是您正在执行的代码。在这些情况下,无限循环往往是由更新事实的规则引起的,而不使用“无循环”。

另外一点 - 您应该认真重新考虑是否适合强制执行这些规则的命令。至少对于上面的例子,似乎没有很好的理由这样做。

于 2013-10-28T19:19:40.873 回答