【问题标题】:drools agenda-group lock-on-active doesn't seem to be working for me流口水议程组锁定活动似乎对我不起作用
【发布时间】:2013-10-28 18:27:44
【问题描述】:

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

但是,在 rule1 执行后,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

【问题讨论】:

    标签: java drools rule-engine


    【解决方案1】:

    来自 Drools 手册:

    每当规则流组激活或议程组收到 焦点,该组中已锁定活动设置为的任何规则 true 将不再被激活......当议程组失败时 关注那些将 lock-on-active 设置为 true 的规则变得符合条件 再次将他们的激活列入议程。

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

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

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

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

    【讨论】:

    • 我想通了。我必须将议程组和自动聚焦添加到设置触发议程组中其他规则的先决条件的规则 1。 rule "rule1" ruleflow-group "validate_precondition" agenda-group "validate1" auto-focus true when $clazz1 : Clazz1 ( isPreConditionSatisfied() ) then //this seems to be triggering the other rules now. end
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多