第83章 デシジョンエンジンにおける実行制御

新しいルールデータが、デシジョンエンジンのワーキングメモリーに入ると、ルールが完全に一致し、実行の対象となる場合があります。単一のワーキングメモリーアクションが、複数のルール実行の対象となる可能性があります。ルールが完全に一致すると、デシジョンエンジンはアクティベーションインスタンスを作成し、ルールと一致したファクトを参照し、アクティベーションをデシジョンエンジンのアジェンダに追加します。アジェンダは、競合解決ストラテジーを使用して、これらのルールのアクティベーションが実行される順番を制御します。

Java アプリケーションで fireAllRules() を最初に呼び出した後、デシジョンエンジンは 2 つのフェーズを繰り返し循環します。

  • アジェンダ評価:このフェーズでは、デシジョンエンジンは実行可能なすべてのルールを選択します。実行可能なルールが存在しない場合は、実行サイクルが終了します。実行可能なルールが見つかると、デシジョンエンジンはアジェンダにアクティベーションを登録し、続いてワーキングメモリーアクションフェーズへと進み、ルール結果アクションを実行します。
  • ワーキングメモリーアクション:このフェーズでは、デシジョンエンジンが、アジェンダに以前登録された有効化されたすべてのルールに対してルール結果アクション (各ルールの then 部分) を実行します。結果のアクションがすべて完了するか、主な Java アプリケーションプロセスが fireAllRules() を再度呼び出すと、デシジョンエンジンがアジェンダ評価フェーズに戻り、ルールを再評価します。

図83.1 デシジョンエンジンにおける 2 つのフェーズの実行プロセス

Two Phase enterprise

アジェンダに複数のルールが存在する場合は、1 つのルールを実行したことが原因で、別のルールがアジェンダから削除される場合があります。これを回避するために、デシジョンエンジンでいつ、どのようにルールを実行するかを定義できます。ルール実行の順番を定義する一般的な方法には、ルールの顕著性、アジェンダグループ、またはルールのアクティベーショングループを使用する方法があります。

83.1. ルールの顕著性

各ルールには、実行の順番を決定する整数の salience 属性があります。顕著性の値が高いルールは、アクティベーションキューの順番で、優先度が高くなります。ルールのデフォルトの顕著性の値はゼロですが、顕著性は負の値でも正の値でもかまいません。

たとえば、以下の DRL ルールのサンプルは、以下に示す順序でデシジョンエンジンのスタックにリスト化されています。

rule "RuleA"
salience 95
when
    $fact : MyFact( field1 == true )
then
    System.out.println("Rule2 : " + $fact);
    update($fact);
end

rule "RuleB"
salience 100
when
   $fact : MyFact( field1 == false )
then
   System.out.println("Rule1 : " + $fact);
   $fact.setField1(true);
   update($fact);
end

RuleB ルールは 2 番目にリストされていますが、RuleA ルールよりも顕著性の値が高いため、最初に実行されます。