1

我有两个非常简单的规则

rule "Volume Validation"
    salience 10
when 

    avs : AvailabilityStatusAndDiscountDisplay( quantity > 1000 || quantity < 0) 

then    

    avs.setAvailable(false);        
    avs.setDiscountRateUnavailableMessage("Unavailable Quanitity");
end 

rule "Discount Rate Calculation -1"

salience 9

when 

     AvailabilityStatusAndDiscountDisplay( productType == "111",calculated==false, available == true, quantity >= 50) 

     avs:   AvailabilityStatusAndDiscountDisplay()
then    

    avs.setDiscountRate("0.65");
    avs.setCalculated(true);

end

但是当数量为 5000 并且可用时,第一条规则将其设置为 false。第二个“规则”看不到这种变化并继续进行评估。即使, https://access.redhat.com/knowledge/docs/en-US/JBoss_Enterprise_SOA_Platform/5/html/JBoss_Rules_5_Reference_Guide/chap-examples.html#id18463514宣传工作内存中更改的对象将被序列中的下一条规则。

编辑。在非常感谢@alicox 的帮助之后

rule "Volume Validation"
salience 10
no-loop true
when 

avs : AvailabilityStatusAndDiscountDisplay( quantity > 1000 || quantity < 0) 

then    

avs.setAvailable(false);        
avs.setDiscountRateUnavailableMessage("Unavailable Quanitity");
update(avs);
end 

rule "Discount Rate Calculation -1"

salience 9

when 

AvailabilityStatusAndDiscountDisplay( productType == "111",calculated==false,   available == true, quantity >= 50) 

avs:   AvailabilityStatusAndDiscountDisplay()
then    

avs.setDiscountRate("0.65");
avs.setCalculated(true);

end

这行得通。

如果我这样理解正确的话,alicox 还提出了通过插入方法创建面包屑的建议

then 
     insert (blah = true) //so as not to fire new rule 
    end 
//new rule 
when 
     blah == false

不确定必须是哪种对象。

4

1 回答 1

1

您需要在更改其属性后在 avs 上调用 update 或 modify ,以便在 LHS 部分对其进行重新评估。

同样在您的第二条规则中,LHS 可以缩短为以下内容:

avs: AvailabilityStatusAndDiscountDisplay( productType == "111",
           calculated==false, available == true, quantity >= 50) 

对事实调用 update 或 modify 将导致在其 LHS 部分中引用该规则的规则再次被触发。如果这不是预期的行为,您有多种选择

1)使用无循环,这将防止在规则中完成更新,触发自身

2)使用更细粒度的事实。

3) 更新后将面包屑事实插入会话中,并检查它们在 LHS 中是否存在。首先在您的模型中定义一个名为 Breadcrumb 的事实类型,并具有一个字符串属性“name”,然后用作以下内容。

when
  not Breadcrumb(name == "calculationXXXDone")
  ....
then
  ...
  //do some work
  ...
  bc = new Breadcrumb()
  bc.name = "calculationXXXDone"
  insert(bc)
于 2012-10-17T06:09:49.173 回答