第87章 デシジョンエンジンのイベントリスナーおよびデバッグロギング

デシジョンエンジンは、ファクトの挿入やルールの実行などのアクティビティーを実行するときにイベントを生成します。イベントリスナーを登録すると、アクティビティーの実行時に決定エンジンがすべてのリスナーを呼び出します。

イベントリスナーには、さまざまな種類のアクティビティーに対応するメソッドがあります。デシジョンエンジンは、イベントオブジェクトを各メソッドに渡します。このオブジェクトには、特定のアクティビティーに関する情報が含まれています。

コードでカスタムイベントリスナーを実装でき、登録済みのイベントリスナーを追加および削除することもできます。このようにして、コードは意思決定エンジンのアクティビティーを通知され、ロギングと監査の作業をアプリケーションのコアから切り離すことができます。

意思決定エンジンは、次のメソッドを持つ次のイベントリスナーをサポートします。

アジェンダイベントリスナー

public interface AgendaEventListener
    extends
    EventListener {
    void matchCreated(MatchCreatedEvent event);
    void matchCancelled(MatchCancelledEvent event);
    void beforeMatchFired(BeforeMatchFiredEvent event);
    void afterMatchFired(AfterMatchFiredEvent event);
    void agendaGroupPopped(AgendaGroupPoppedEvent event);
    void agendaGroupPushed(AgendaGroupPushedEvent event);
    void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event);
    void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event);
    void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event);
    void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event);
}

ルールランタイムイベントリスナー

public interface RuleRuntimeEventListener extends EventListener {
    void objectInserted(ObjectInsertedEvent event);
    void objectUpdated(ObjectUpdatedEvent event);
    void objectDeleted(ObjectDeletedEvent event);
}

イベントクラスの定義については、GitHub リポジトリー を参照してください。

Red Hat Decision Manager には、これらのリスナーのデフォルトの実装が含まれています。DefaultAgendaEventListener および DefaultRuleRuntimeEventListenerこれらの各実装を拡張して、特定のイベントを監視できます。

たとえば、以下のコードは DefaultAgendaEventListener を拡張して AfterMatchFiredEvent イベントを監視し、このリスナーを KIE セッションにアタッチします。コードは、ルールが実行される (起動される) ときにパターンマッチを出力します。

アジェンダの AfterMatchFiredEvent イベントを監視および出力するコード例

ksession.addEventListener( new DefaultAgendaEventListener() {
   public void afterMatchFired(AfterMatchFiredEvent event) {
       super.afterMatchFired( event );
       System.out.println( event );
   }
});

Red Hat Decision Manager には、以下のデシジョンエンジンアジェンダと、デバッグロギング用のルールランタイムイベントリスナーも含まれています。

  • DebugAgendaEventListener
  • DebugRuleRuntimeEventListener

これらのイベントリスナーは、同様のサポートされているイベントリスナーメソッドを実装し、デフォルトでデバッグ出力ステートメントを含んでいます。サポートされている特定のイベントに対して追加の監視コードを追加できます。

たとえば、以下のコードは DebugRuleRuntimeEventListener イベントリスナーを使用して、すべてのワーキングメモリー (ルール ランタイム) イベントを監視および出力します。

すべてのワーキングメモリーイベントを監視および出力するコード例

ksession.addEventListener( new DebugRuleRuntimeEventListener() );

87.1. イベントリスナー開発のためのプラクティス

意思決定エンジンは、ルールの処理中にイベントリスナーを呼び出します。呼び出しは、デシジョン エンジンの実行をブロックします。したがって、イベントリスナーは意思決定エンジンのパフォーマンスに影響を与える可能性があります。

中断を最小限に抑えるため、以下のガイドラインに従ってください。

  • どんなアクションでも、できるだけ短くしなければならない。
  • リスナークラスは状態を持ってはいけない。デジシジョン エンジンは、いつでもリスナークラスを破棄して再作成できます。
  • 異なるイベントリスナーの実行順序に依存するロジックは使用しない。
  • リスナー内にデシジョンエンジン外の異なるエンティティーとのインタラクションを含めない。例えば、イベント通知のための REST 呼び出しを含めないでください。例外はロギング情報の出力です。しかし、ロギングリスナーは可能な限りシンプルにする必要があります。
  • リスナーを使用して、変数の値を変更するなど、デシジョンエンジンの状態を変更できます。