2.4. イベントリスナー

セッションは、リスナーの登録や削除のメソッドを提供します。ProcessEventListener を使用して、プロセスの開始や完了、ノードの出入りなど、プロセス関連のイベントをリッスンすることができます。ProcessEventListener クラスの様々なメソッドが以下の例で示されています。イベントオブジェクトは、プロセスインスタンスやイベント関連するノードインスタンスなど関連の情報にアクセスできるようにします。この API を使用してイベントリスナーを登録することができます。

例2.2 ProcessEventListener クラス

public interface ProcessEventListener {

  void beforeProcessStarted( ProcessStartedEvent event );
  void afterProcessStarted( ProcessStartedEvent event );
  void beforeProcessCompleted( ProcessCompletedEvent event );
  void afterProcessCompleted( ProcessCompletedEvent event );
  void beforeNodeTriggered( ProcessNodeTriggeredEvent event );
  void afterNodeTriggered( ProcessNodeTriggeredEvent event );
  void beforeNodeLeft( ProcessNodeLeftEvent event );
  void afterNodeLeft( ProcessNodeLeftEvent event );
  void beforeVariableChanged(ProcessVariableChangedEvent event);
  void afterVariableChanged(ProcessVariableChangedEvent event);

}
'Before' および 'after' イベントは通常スタックのように振る舞います。つまり、以前のイベントの直接的結果として発生したイベントはイベントの 'before' と 'after' の間で発生します。例えば、後続のノードは、ノードから離れた結果としてトリガーされた場合、 (最初のノードを離れたことが直接の原因で、2 番目のノードをトリガーされているため) 'NodeTriggered' イベントは離れたノードの 'beforeNodeLeftEvent' と the 'afterNodeLeftEvent' の間で発生します。このトリガーは、イベント間の関係をより簡単にもたらすことができます。同様に、プロセス開始の直接的な結果となる 'NodeTriggered' と 'NodeLeft' イベントはすべて 'beforeProcessStarted' と 'afterProcessStarted' イベントの間で発生します。一般的に特定のイベントが発生した場合に通知が必要であれば、'before' イベントのみを参照します (イベントが実際に発生する直性に起こるため)。'after' イベントだけを参照する場合、イベントが違う順番で引き起こされていると感じるかもしれませんが、今回の場合は 'after' イベントはスタックとしてトリガーされているためです (このイベントがすでに引き起こされた結果としてすべてのイベントがトリガーされている場合のみ 'after' イベントが引き起こされます)。このイベントに関連する処理がすべて完了したことを確認したい場合のみ、'After' イベントを使用します。例えば、特定のプロセスインスタンスの開始が完了した時に通知が必要な場合などは、'after' イベントが理想的です。
すべてのノードが常に 'NodeTriggered' や 'NodeLeft' イベントを生成するわけではないことに注意してください。ノードの種類により、'NodeLeft' イベントのみを生成するノードもあり、'NodeTriggered' イベントのみを生成するノードもあります。例えば、 (他のノードによりトリガーされたのではなく外部からアクティベートされたがため、'left' イベントが生成されているため) 中間イベントを 'Catch' してもトリガーされたイベントは生成されません。同様に、中間イベントが 'throw' されても 'left' イベントは生成されません (外向きの接続がないためノードから実際には離れていないため 'triggered' イベントのみが生成されます)。
イベントリスナーは、(コンソールまたはファイルシステムのファイルへ) 監査ログを作成するために利用できるように提供されています。この監査ログには、ランタイム時に発生したイベントがすべて含まれています。これらのロガーはデバッグ目的でのみ使用するようにしてください。
以下のロガーの実装はデフォルトでサポートされています。

表2.1 サポートされているロガー

タイプ 説明 必須の引数
コンソール ロガーが閉じられたり、イベントの数が所定のレベルに達したりした場合は、出力がコンソールに書き込まれます。 ログすべきナレッジセッション
ファイル 出力は XML でファイルに書き込まれます。
ログすべきナレッジセッション
作成するログファイル名
スレッドファイル 指定の間隔があくと、出力がファイルに書きだされます。これは、デバッグ中にリアルタイムの進捗を可視確認する際に便利です。
ログすべきナレッジセッション
作成するログファイル名
イベントを保存する間隔 (ミリ秒)
KnowledgeRuntimeLoggerFactory は、以下の例のようにロガーをセッションに追加できるようにします。アプリケーションの使用が終わるとロガーを常に終了するようにしてください。

例2.3 KnowledgeRuntimeLogger

KnowledgeRuntimeLogger logger =
    KnowledgeRuntimeLoggerFactory.newFileLogger( ksession, "test" );
// add invocations to the process engine here,
// e.g. ksession.startProcess(processId);
...
logger.close();
ファイルベースのロガーにより作成されたログファイルには、ランタイム時に発生したすべてのイベントをまとめて XML ベースのサマリーが含まれています。Drools プラグインで Audit View を使用して JBoss Developer Studio で開くことができます。Audit View ではイベントがツリー形式で確認できます。'before' と 'after' イベントの間で発生したイベントは、各イベントの子として表示されます。以下のスクリーンショットは、プロセスが開始された結果、Start ノードと Action ノード、End ノードがアクティベートされ、プロセスが完了するという簡単な例です。
この画像は、Start ノードと End ノードが実行されるプロセスの例を示しています。