如何在Drools中控制规则评估(或规则执行)阶段?

时间:2019-04-07 14:08:07

标签: drools execution rules evaluation

我知道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

我希望第三条规则被触发,并且控制台中有一条“ Rule is fired”行,但未执行。
据我了解,问题在于规则评估阶段,即在执行之前一次性评估所有三个规则,然后才按照它们的“显着性”顺序执行它们。
并且在评估的当下, $ resource1.amount 5 ,这就是为什么不触发第三条规则的原因。如果您在第一个规则中输入的数字大于 10 ,则3d规则将触发。而且,如果您根本不设置金额-则会导致异常。
如何解决此问题,以便触发3d规则?

4 个答案:

答案 0 :(得分:1)

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

您可以在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

希望有帮助,

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我测试了代码,并触发了Rule3

drools.version 7.32.0.Final

enter image description here