Java drools议程组锁定在活动状态下';我好像不为我工作

Java drools议程组锁定在活动状态下';我好像不为我工作,java,drools,rule-engine,Java,Drools,Rule Engine,在下面的规则中,我希望首先为每个clazz1执行规则1,并且只有在满足该规则的情况下,才需要执行其他规则(因为lock on active) 但是,在执行规则1之后,drools正在执行 规则1、规则2、规则3和 规则2,规则3,然后回到规则1 如果我的配置不正确,你能建议一下吗 rule "rule1" ruleflow-group "validate_precondition" when $clazz1 : Clazz1 ( isPreConditionSatisfi

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

但是,在执行规则1之后,drools正在执行 规则1、规则2、规则3和 规则2,规则3,然后回到规则1

如果我的配置不正确,你能建议一下吗

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将不再被激活。。。当议程组失败时 将“锁定活动”设置为“真”的聚焦规则将变为合格规则 再次将他们的活动列入议程

因此,考虑到您的每个规则都在不同的议程组中,并且您在每次规则激活后都会改变焦点,使用“锁定活动”将不会取得任何效果

从您所说的内容来看,规则引擎似乎正在多次激活。假设它不是在无限循环中循环,我认为这是由于工作内存中有不止一个Clazz1实例造成的

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


另一个注意事项——你应该认真地重新考虑执行这些规则的命令是否合适。至少在上面的例子中,这样做似乎没有什么好的理由。

我想出来了。我必须在规则1中添加议程组和自动聚焦,这为触发议程组中的其他规则设置了先决条件<代码>规则“rule1”规则流组“validate_前提条件”议程组“validate1”当$clazz1:clazz1(ispreconditionsuccessed())时自动聚焦为true//此时似乎触发了其他规则。结束