drools议程组锁定活动似乎对我不起作用

时间:2013-10-28 18:27:45

标签: java drools rule-engine

在下面的规则中,我希望首先为每个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

1 个答案:

答案 0 :(得分:1)

来自Drools手册:

  

每当规则流组变为活动状态或议程组接收时   焦点,该组中具有锁定活动设置的任何规则   当议程小组失败时,将不会再激活true   将lock-on-active设置为true的那些规则的重点变为合格   再次将他们的激活提上日程。

因此,鉴于您的每个规则都在不同的议程组中,并且您在每次激活规则后都在改变焦点,使用锁定活动将无法实现任何目标。

根据您的说法,这听起来像规则引擎多次激活。假设它没有在无限循环中循环,我希望这是由于工作内存中有多个Clazz1实例。

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

另外一个注意事项 - 您应该认真考虑是否适合执行这些规则的执行。至少在上面的例子中,似乎没有充分的理由这样做。