2012-04-05 10 views
0

Dies sollte einfach sein, aber ich bin immer noch verloren. Es gibt eine sehr ähnliche Position hier: How to share data between Drools rules in a map? aber es behebt nicht mein Problem:Teilen Sie Daten unter Regeln mit einer Karte

Ich habe eine Reihe von Regeln und, bevor sie starten, füge ich eine Karte < String, Object > als Tatsache. In diesen Regeln, die ich die Karte verwenden, um einige Schlussfolgerungen wie zu schreiben:

when 
    $map : Map(); 
    something ocurrs; 
then 
    $map.put("conclusion1", 100); 

Nun würde ich diese Zwischen Schlussfolgerungen in anderen Regeln verwenden möchten, so etwas wie:

when 
    $map : Map(this["conclusion1"] > 50) 
then 
    do something cool; 

Das Problem ist, dass, wenn ich führe die Regeln aus, so wie die zweite Regel die Schlussfolgerungen des ersten nicht sieht und sie nicht feuert. Ich habe versucht, einen Haltepunkt zu setzen und das Arbeitsgedächtnis zu analysieren, und in der Tat würde die Karte die Schlussfolgerung1, 100 enthalten, nachdem die erste Regel gefeuert wurde. Ich habe auch versucht, indem Sie eine Aktualisierung ($ map) in der Schlussfolgerung machen, aber das würde eine Endlosschleife auslösen.

Eine Idee, warum das nicht funktionieren würde, oder eine alternative Lösung für mein Problem?

Danke!

Antwort

0

Wenn Sie einen Fakt ändern, müssen Sie die Engine benachrichtigen, die Sie gerade tun. Eine Möglichkeit, dies zu tun, ist die Verwendung von modify(). Zum Beispiel:

+0

Und um das Endlosschleife Problem zu adressieren, aktualisieren Sie die Regel, die das Element "conclusion1" auf die Karte setzt, nur dann, wenn "conclusion1" noch nicht existiert; d.h., Map (containsKey ("conclusion1") == false) '. Dies verhindert, dass die Regel reaktiviert wird, wenn "Schlussfolgerung1" Teil des Keysets ist. – mike9322