2016-11-15 3 views
0

私はDroolsのバージョン6.5.0.Finalを使用していますgetObjectメソッドとgetOldObject方法で同じ値を持っており、私のような単純なルールがあります。だから私もRuleRuntimeEventListenerクラスを実装し、それを取得DroolsのRuleRuntimeEventListenerのobjectUpdated方法は

rule "Test Rule" 
when 
    $obj : MyObject(testValue == null || testValue != "NEW") 
then 
    $obj.testValue = "NEW"; 
    update($obj); 
end 

をこのルールが実行されると呼び出されます。問題はObjectUpdatedEventインスタンスのgetObject()とgetOldObject()呼び出しで渡されたものと同じ正確なオブジェクト(更新後のオブジェクト)を返します。このため、getOldObject()呼び出しは、testValueプロパティーの値が "NEW"のオブジェクトを戻します。私はgetOldObjectが私がルールによって変更された後の "NEW"ではないtestValueの値を返すことを期待しています。

これは私にはバグのようであり、誰かがこれに似た問題を抱えているのか、それとも回避策があるのだろうかと疑問に思っていましたか?オブジェクトのプロパティがルールによって変更され、古い値と新しい値が何であったかを通知されたい

Java BeanのPropertyChangeListenerの使用がサポートされていますが、addPropertyChangeListenerメソッドとremovePropertyChangeListenerメソッドを使用してファクトオブジェクトを作成する必要があります。また、PropertyChangeSupportを使用して、 firePropertyChangeメソッドによるプロパティ変更イベント。私は本当にそれをする必要はありません。

おかげ

+0

ルールの開始前後に反応するイベントリスナーが提供するすべての可能性を調査しましたか?参加しているオブジェクトの古い状態を保存する可能性があります。これは、必要のないすべてのアプリケーションを厳しく罰するので、デフォルトでは起こりそうにないものです。 - 監査の変更は、追加のRHSコードで実装することもできます。 – laune

+0

コメントありがとうございます。私はすべてを調査したと思うし、そのイベントリスナーが更新前と更新後にオブジェクトを渡すために、何が失われる可能性があるのか​​分からない。私は前の値を渡していない場合、getOldObject()メソッドを持つ点が何であるか分かりません。 – Mike

答えて

0
public class Differ implements AgendaEventListener { 

    private List<Object> oldFacts; 

    public void beforeMatchFired(BeforeMatchFiredEvent event){ 
     List<Object> facts = event.getMatch().getObjects(); 
     // copy (!) facts into oldFacts 
    } 

    public void afterMatchFired(AfterMatchFiredEvent event){ 
     List<Object> facts = event.getMatch().getObjects(); 
     // compare facts with oldFacts 
    } 
    //... 
} 

あなたはコピーとの比較では、より選択的であるとよいでしょう。また、文字列化されたオブジェクトの内容を使用して比較する一般的な方法も考えられます。

BeforeMatchFiredEvent 
+0

ありがとうございます。しかし、このソリューションでは、古いファクトオブジェクトがルールによっても変更されるかどうかはまだわかりませんが、古いファクトオブジェクトをコピーしています。また、私はRuleRuntimeEventListenerでobjectUpdated(ObjectUpdatedEventイベント)メソッドを使用しませんか?もしそうなら、この方法のポイントは何ですか?ありがとう。 – Mike

+0

ルールに応じて、変更された事実を知っています。それが私が書いた理由です(「もっと選択的」になる)。とにかくすべての変更の詳細を追跡しようとするのは何ですか?何が変更されているのかを知っているルールのRHSにこれを統合しないでください。 - 前に示したように、一般的な解決策はあるオーバヘッドを引き起こすように拘束されています。 – laune

関連する問題