是什么使这个规则集的顺序

时间:2017-04-16 08:03:54

标签: jboss drools

我目前正在学习Drools并阅读本书Mastering JBoss Drools 6

在第4章的开头,给出了一个示例来说明delete关键字的使用。就是这个例子:

rule "Init current date" 
when 
then 
   insert(new Date()); 
end 

rule "Expire coupons" 
when 
   $now: Date() 
   $cp: Coupon(validUntil before $now) 
then 
   delete($cp); 
end 

rule "Execute coupon" 
when 
   $o: Order() 
   $cp: Coupon(order == $o) 
then 
   System.out.println(" We have a coupon for this order!"); 
end

现在我的问题是:为什么"执行优惠券"规则被解雇晚于"过期优惠券"规则。由于我已经知道规则的顺序是不确定的,所以我认为"执行优惠券"规则可以在其他两个规则之前触发

1 个答案:

答案 0 :(得分:1)

你是对的。根据我的经验,我甚至会在“执行优惠券”和“#34;首先解雇,因为后来的规则通常先被解雇。

显然,必须通过

来纠正这个例子
rule "Execute coupon" 
when
    $now: Date() 
    $o: Order() 
    $cp: Coupon(order == $o, validUntil after $now ) 
then 
    System.out.println(" We have a coupon for this order!"); 
end

或使用显着性(如果可能,应尽量避免使用)。

然而(我没有这本书)我还可以设想一个规则集可以按照给定的方式工作:

session.insert( new Date() );
session.insert( coupon );
session.fireAllRules();

session.insert( order );
session.fireAllRules();