我知道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不明白,当你改变事实的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
希望能帮助到你,
查看议程/激活组的文档,您可以使用该概念控制规则组的执行
所以这是一个错误,现在它已在最后一次更新中修复。这是问题:https://issues.jboss.org/browse/DROOLS-3972