1

私は2つの非常に単純なルールを持っています

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 で、最初のルールによって available が false に設定されている場合。2 番目の「ルール」はその変更を認識できず、評価を続行します。それでも、 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

LHS 部分で再評価するには、そのプロパティを変更した後、avs で update または modify を呼び出す必要があります。

また、2 番目のルールでは、LHS を次のように短縮できます。

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

ファクトに対して更新または変更を呼び出すと、LHS 部分でそのルールを参照するルールが再度起動されます。これが予期された動作でない場合は、いくつかのオプションがあります

1) no-loop を使用します。これにより、ルールで行われる更新が防止され、それ自体がトリガーされます。

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 に答える