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

问题描述 投票:0回答:2

我知道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.amount为5,这就是为什么没有触发第三条规则。如果在第一个规则中输入的数字超过10,则将触发3d规则。如果你没有设定金额 - 它会导致异常。 如何解决此问题以便3d规则触发?

drools execution rules evaluation
2个回答
2
投票

我的猜测是Drools不明白,当你改变事实的Double.parseDouble(amount) > 10时,必须重新评估表达式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

希望能帮助到你,


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.