第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 呼び出しを含めないでください。例外はロギング情報の出力です。しかし、ロギングリスナーは可能な限りシンプルにする必要があります。
- リスナーを使用して、変数の値を変更するなど、デシジョンエンジンの状態を変更できます。