0

ルール:

rule "Accounting_11" dialect "mvel" 
//For any value of l except given in Accounting_12
salience 1 
activation-group "Group l"  
auto-focus true
lock-on-active
no-loop true 
when $iv:Invoice(x in ("D20","D21","D22", "D23", "D24","D25"),y =="E20",z =="F20",a =="G20") 
then modify($iv) { sg.setA("ALL l"), sg.setB("C20")} 
end

rule "Accounting_12"  dialect "mvel" 
//Exceptions of l
salience 2  
activation-group "Group l" 
auto-focus true
lock-on-active
no-loop true 
//Pattern is similar to Accounting_11 with additional constraint "l in (....)"
when $iv:Invoice(l in ("C20","C21","C22", "C23", "C24","C25") , x in ("D20","D21","D22", "D23", "D24","D25"),y =="E20",z =="F20",a =="G20") 
then modify($iv) { sg.setA("Sepcific l"), sg.setB("C20")} 
end

ループ内のワーキング メモリに 2 つのファクトを挿入しました。

  • Invoice(l="C20", x="D20", y= "E20", z="F20",", a="G20")
  • Invoice(x="D20", y= "E20", z="F20", a="G20")

予想どおり、fireAllRules() を呼び出します。3 つのアクティベーションが作成されます。

==>[ActivationCreatedEvent: getActivation()=[[ Accounting_11 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
    ==>[ActivationCreatedEvent: getActivation()=[[ Accounting_11 active=false ] [ [fact 0:1:2489285:2489285:1:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@25fbc5] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
    ==>[ActivationCreatedEvent: getActivation()=[[ Accounting_12 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]

予想されるアクティベーションの 1 つが発生します

==>[BeforeActivationFiredEvent:  getActivation()=[[ Accounting_12 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]

しかし、それは他のすべてのアクティベーションをキャンセルします。

==>[ActivationCancelledEvent: getCause()=CLEAR, getActivation()=[[ Accounting_11 active=false ] [ [fact 0:2:4445234:4445234:2:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@43d432] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]
==>[ActivationCancelledEvent: getCause()=CLEAR, getActivation()=[[ Accounting_11 active=false ] [ [fact 0:1:2489285:2489285:1:DEFAULT:NON_TRAIT:org.cpg.poc.drools.keloy.domain.Invoice@25fbc5] ] ], getKnowledgeRuntime()=org.drools.core.impl.StatefulKnowledgeSessionImpl@1743ccd]

同じファクトハンドル (Invoice@43d432) に対して作成されたアクティブ化、つまり l=C20 のものだけをキャンセルすべきではありませんか?

Invoice@25fbc5に対して作成されたアクティベーションがキャンセルされるのはなぜですか?

注:ファクトを挿入するたびにルールを実行すると、期待どおりの結果が得られます。

4

1 に答える 1

0

ルール属性 no-loop および lock-on-active を使用することは、ルールのオーサリングを簡素化するものとして宣伝されています。これは、特定の割合のユース ケースに当てはまります。ただし、これは常に、ルール条件の基本であるロジックの厳格な適用を回避する方法です。ルール条件に完全なロジックを追加するには、より多くの作業が必要になる場合がありますが、確実に堅牢なロジックが作成され、本当に必要なルールが実行されます。

そうは言っても、挿入されたルールのために何が起こるべきかわかりません。明らかに、Accounting_11 と Accounting_12 の制約は重複しており、Accounting_12 はより制限的です。これは常に疑わしい状況です。両方の結果が発生することを望みますか、それとも 1 つだけが発生することを望みますか? Accounting_12 はエイリアンが高いため、( field の値に関係なく) 優先されますl。ルール属性がなければ、他のアクティベーションはアクティブのままであると予想されますが、ルール属性を使用するとlock-on-active、アクティベーションがキャンセルされます。

私が言ったように、基本的な制約で必要なロジックを記述することが望ましいです。

たとえば、lセット `("C20", "C21", "C22", "C23", "C24", "C25") で定義された範囲内にある値に対してルールを有効にしない場合は、この制約を追加します。 :

$iv:Invoice(l not in ("C20", "C21", "C22", "C23", "C24", "C25"),...)
于 2015-06-03T13:14:40.750 に答える