【问题标题】:How to control rule evaluation (or rule execution) stages in Drools?如何控制 Drools 中的规则评估(或规则执行)阶段?
【发布时间】:2019-04-07 14:08:06
【问题描述】:

我知道 Drools 中的“显着性”在规则执行顺序下提供控制。但以上是我所面临的“显着性”无法再提供帮助时的问题示例。

这里我有三个规则一个接一个地执行:

rule "Rule 1"
salience 30
when

then
    Resource resource1 = new Resource();
    resource1.setName("Resource 1");
    resource1.setAmount("5");
    insert(resource1);
    System.out.println("First");
end

rule "Rule 2"
salience 20
//no-loop (interesting, it doesn't lead to a loop)
when
    $resource1: Resource(name == "Resource 1")
then
    modify($resource1) {setAmount("20")};
    System.out.println("Second");
end

rule "Rule 3"
salience 10
when
    $resource1: Resource(name == "Resource 1", 
    Double.parseDouble(amount) > 10)
then
    System.out.println("Rule is fired");
end

我预计第三条规则会被触发,并且控制台中有一条“规则被触发”行,但它没有被执行。
据我了解,问题在于规则评估阶段,当所有三个规则在执行前一次评估,然后才根据它们的“显着性”轮次执行。
并且在评估时 $resource1.amount5,这就是为什么没有触发第三条规则的原因。如果您在第一条规则中输入大于 10 的数字,则 3d 规则将触发。如果您根本不设置金额 - 会导致异常。
如何解决此问题以触发 3d 规则?

【问题讨论】:

    标签: drools execution rules evaluation


    【解决方案1】:

    我的猜测是 Drools 不明白,当您更改事实的 amount 时,必须重新评估表达式 Double.parseDouble(amount) > 10。问题与您编写表达式的方式有关。

    你可以看看我在this other question的回答。看看“另一种解决方案”部分。

    我建议您修改模型并向您的类添加getAmountAsDouble() 方法,以便在其中进行转换。您还需要注释 setAmount() 方法,让 Drools 知道它修改了 getAmountAsDouble() 返回的值:

    public class Resource {
    
      private String amount;
    
      @Modifies( { "amountAsDouble" } )
      private void setAmount(String amount){
        this.amount = amount;
      }
    
      private String getAmount(){
        return this.amount;
      }
    
      private String getAmountAsDouble(){
        return Double.parseDouble(this.amount);
      }
    
    }
    

    现在你的规则可以改写为:

    rule "Rule 3"
    salience 10
    when
        $resource1: Resource(name == "Resource 1", 
        amountAsDouble > 10)
    then
        System.out.println("Rule is fired");
    end
    

    希望对你有帮助,

    【讨论】:

    • 感谢您的回答,我已将这些方法设为公开并导入“import org.kie.api.definition.type.Modifies”,但它仍然不起作用。错误是:java.lang.RuntimeException:在 [Rule 3... 中评估约束“getAmountAsDouble() > 10.0”时出错...而且,如果我在第一条规则中设置的数量超过 10 - 它会毫无例外地执行。所以我可以得出结论,我们没有影响评估阶段
    【解决方案2】:

    查看议程/激活组的文档,您可以使用该概念控制规则组的执行

    【讨论】:

    • 你的意思是像显着性这样的规则的执行吗?但问题是,这里我们处理的是评估阶段。据我了解,Drools 在执行前将金额评估为“5”。然后在规则 3 中 Drools 不知道它在规则 2 中已被更改
    • @AlmasKamitov 你是如何解决这个问题的?在这里没有看到任何一个答案作为接受的答案。那么最后什么对你有用?
    • 所以这是一个错误,现在它已在最后一次更新中修复。这是问题所在:issues.jboss.org/browse/DROOLS-3972 现在作为临时解决方案,我只是创建了新对象,然后将它们作为 facs 插入到其他规则中,例如: insert new ResourceParameter("valueIsChanged")
    【解决方案3】:

    所以这是一个错误,现在它已在最后一次更新中得到修复。 这是问题:https://issues.jboss.org/browse/DROOLS-3972

    【讨论】:

      【解决方案4】:

      我测试了代码,rule3 被触发了

      drools.version 7.32.0.Final

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-30
        • 2013-07-15
        • 1970-01-01
        • 2019-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-08
        相关资源
        最近更新 更多