我知道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规则?
答案 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)