2016-09-26 3 views
0

Drools 5.5.0.FinalからDrools 6.5.0.CR2にアップグレードする途中で、カスタムイベントリスナーで問題が発生していますObjectInsertedEventsの場合は、挿入をトリガしたルールのLHSを参照します。発生したルールのLHSバインディングのタイプに応じて、リスナーは新しく挿入されたファクトのプロパティを更新します。Drools 6 - ObjectInsertedEventのLHSへのアクセス

はDroolsの5では、我々はDebugWorkingMemoryEventListenerを拡張するカスタムイベントリスナでこれをやったと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はDroolsの6で廃止されましたので、私はRuleRuntimeEventListenerに更新されましたが、それは私のように見えますObjectInsertedEventを起動したルールのLHSにアクセスすることはできません。ルール自体(名前、パッケージ、メタデータ)に関する基本情報のみが使用できます。代わりに、私はAgendaEventListenerとAfterMatchFiredEventを使って解雇されたルールのLHSにアクセスできましたが、オブジェクトが挿入されているかどうかはわかりませんし、2)私ができる場合でもオブジェクトを更新する方法はありませんそれが挿入されているかどうかを判断する。

Drools 5のリスナー動作をDrools 6 APIの変更でどのように複製できますか?ありがとう。

答えて

0

BeforeMatchFired、AfterMatchFired、およびObjectInsertedEventを実装すると、ルールの実行中に挿入されたファクトのコレクションを作成できます。 Matchオブジェクトは、ルールのLHSからすべてのバインディングを提供します。挿入されたオブジェクトはすべて使用可能であり、AfterMatchFiredイベントで処理する必要があります。

私はあなたのコードを6.xに移植することはできませんが、コレクションを維持するための適度な追加コードしかありません。

関連する問題