如何使规则在drools中按预期流程执行

时间:2011-03-18 16:14:38

标签: drools

以下逻辑:

if (order.getPrice()<200 ) {  
   order.setPrice(order.getPrice()-10);  
} else {  
   order.setPrice(order.getPrice()-20);  
   if (order.getPrice()<200 ) {  
     //do nothing  
    }else {  
      order.setFreeShip("true");  
    }  
}  

对于上面的逻辑,如果我想在drools规则中实现。

rule "rule 1"  
when   
    $o:Order ( amount<200);  
 then   
    $o.setPrice($o.getPrice()-10);  
end  

rule "rule 2"  
when   
    $o:Order (amount>200);  
 then   

    $o.setPrice($o.getPrice()-20);  

end  

如果事实的价格是210,则规则2被激活,然后将触发rule1。这不是预期的。我不想收回()。那么这个问题有更好的解决方案吗?

我可以像执行令牌机制一样执行规则时指定顺序规则。

感谢。

2 个答案:

答案 0 :(得分:1)

不,您不能仅为一个规则或一组规则指定顺序。您需要创建一个标志并将其用作警卫,例如:

rule "rule 1"  
when   
    $o:Order ( amount<200);  
    not: Flag(object=$o)
 then   
    $o.setPrice($o.getPrice()-10);  
    insert( new Flag($o) );
end  

rule "rule 2"  
when   
    $o:Order (amount>200); 
    not: Flag(object=$o)
 then   
    $o.setPrice($o.getPrice()-20);  
    insert( new Flag($o) );
end  

public class Flag {
  private final Object object;
  public Flag(Object o) {
    this.object = o;
  }

  //add getter for object
  //delegate equals and hashcode to object
}

答案 1 :(得分:1)

规则“NYuser_Rule”

no-loop true
ruleflow-group "EvalLoopcondition"
when
    m:HelloProcessModel(userlocation in ("NewYorkUser"), count < 4)
then
    m.setLoopcondition(6);update(m);

规则“ChileUser_Rule”

no-loop true
ruleflow-group "EvalLoopcondition"
when
    m:HelloProcessModel(userlocation in ("ChileUser"), count < 3)
then
    m.setLoopcondition(5);update(m);

这样的事可以帮助你。