2016-11-15 54 views
0

我使用Drools的版本6.5.0.Final相同的價值,我有一個像一個簡單的規則:Drools的RuleRuntimeEventListener的objectUpdated方法具有的getObject和getOldObject方法

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

所以我還實施了RuleRuntimeEventListener類和它得到在執行此規則時調用。問題是傳入的ObjectUpdatedEvent實例的getObject()和getOldObject()調用返回相同的確切對象 - 這是更新後的對象。所以對於這個getOldObject()調用返回一個值爲「NEW」的testValue屬性的對象。我期望getOldObject返回給我的是不是「NEW」的testValue的值,它是在規則更改後的值。

這看起來像是一個bug,並想知道如果有人有任何類似的問題,或者如果有任何解決方法?當一個對象的任何屬性被一個規則改變時,我希望得到通知以及新舊值是什麼。

我看到支持使用java bean的PropertyChangeListener,但看起來像我必須使用addPropertyChangeListener和removePropertyChangeListener方法創建事實對象,並且在所有事實的setter方法中,我必須使用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 event)方法嗎?如果是這樣,那麼這種方法有什麼意義呢?謝謝。 – Mike

+0

根據規則,你知道哪些事實被改變 - 這就是爲什麼我寫了(「更具選擇性」)。 - 無論如何,試圖詳細記錄所有變化的重點是什麼?或者不把它融入規則的RHS中,你知道什麼被改變了? - 正如我之前指出的那樣,一個通用的解決方案肯定會導致一些開銷。 – laune

相關問題