2016-09-26 5 views
0

Ich bin dabei, von Drools 5.5.0.Final zu Drools 6.5.0.CR2 zu aktualisieren, und ich bin in ein Problem mit einem benutzerdefinierten Ereignis-Listener, der zuhört für ObjectInsertedEvents und verweist auf die LHS der Regel, die die Einfügung ausgelöst hat. Abhängig von den Typen der LHS-Bindungen der gefeuerten Regel aktualisiert der Listener eine Eigenschaft des neu eingefügten Fakts.Drools 6 - Zugriff auf die LHS eines ObjectInsertedEvent

In Drools 5, haben wir diese mit einem benutzerdefinierten Ereignis-Listener, die DebugWorkingMemoryEventListener erweitert und umgesetzt WorkingMemoryEventListener:

public void objectInserted(ObjectInsertedEvent event) { 
    Rule firedRule = event.getPropagationContext().getRuleOrigin(); 

    if (firedRule != null) { 
     PropagationContext pc = event.getPropagationContext(); 
     Tuple tuple = pc.getLeftTupleOrigin(); 
     Map<String, Declaration> declarationsMap = firedRule.getDeclarations(); 

     // Iterate through the LHS variable bindings 
     for (Map.Entry<String, Declaration> entry : declarationsMap.entrySet()) { 

      // Get the value, via the handle to the fact in working memory to which the variable is bound 
      Declaration declaration = entry.getValue(); 
      FactHandle factHandle = tuple.get(declaration); 

      // Get the object in working memory via the fact handle 
      Object bindingObj = ss.getObject(factHandle) 

      // do some other checks, update the inserted object if necessary 
     } 
    } 
} 

WorkingMemoryEventListener in geifert 6 veraltet, also habe ich zu RuleRuntimeEventListener aktualisiert, aber es sieht aus wie ich kann nicht mehr auf die LHS der Regel zugreifen, die das ObjectInsertedEvent ausgelöst hat, nur einige grundlegende Informationen über die Regel selbst (Name, Paket, Metadaten). Alternativ könnte ich mit einem AgendaEventListener und AfterMatchFiredEvent auf die LHS einer gefeuerten Regel zugreifen, aber das 1) sagt mir nicht, ob ein Objekt eingefügt wurde, und 2) gibt mir keine Möglichkeit, dieses Objekt zu aktualisieren, selbst wenn ich könnte Bestimmen Sie, ob es eingefügt wurde.

Wie kann ich das Listener-Verhalten replizieren, das ich in Drools 5 mit diesen Drools 6 API-Änderungen hatte? Vielen Dank.

Antwort

0

Wenn Sie BeforeMatchFired, AfterMatchFired und ObjectInsertedEvent implementieren, können Sie eine Sammlung von Fakten erstellen, die beim Auslösen einer Regel eingefügt werden. Das Match-Objekt gibt Ihnen alle Bindungen von der LHS der Regel. Alle eingefügten Objekte sind verfügbar und sollten beim AfterMatchFired-Ereignis verarbeitet werden.

Ich sehe nichts, was Sie davon abhält, Ihren Code auf 6.x zu portieren, mit nur gemäßigtem zusätzlichen Code für die Wartung der Sammlung.

Verwandte Themen