84.3. Phreak における順次モード

順次モードは、デシジョンエンジンにおける高度なルールベースの設定で、Phreak がサポートしています。順次モードでは、デシジョンエンジンは、ワーキングメモリーでの変更に関係なく、デシジョンエンジンアジェンダにリスト化された順番でルールを一度評価します。順次モードでは、デシジョンエンジンがルールのステートメント insertmodify、または update をすべて無視し、ルールを単一シーケンスで実行します。その結果、ルールの実行は順次モードの方が速くなる可能性がありますが、重要な更新がルールに適用されない可能性があります。

ステートフルな KIE セッションは本来、以前呼び出された KIE セッションのデータを使用するため、順次モードが適用されるのはステートレスな KIE セッションのみとなります。ステートレスな KIE セッションを使用し、ルールを実行して、アジェンダ内の後続のルールを決定するには、順次モードを有効にしないでください。デシジョンエンジンでは、デフォルトで順次モードは無効となっています。

以下のオプションのいずれかを使用して、順次モードを有効にします。

  • システムプロパティー drools.sequentialtrue に設定:
  • プログラムを用いて KIE ベースを作成中に順次モードを有効化:

    KieServices ks = KieServices.Factory.get();
    KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration();
    kieBaseConf.setOption(SequentialOption.YES);
    KieBase kieBase = kieContainer.newKieBase(kieBaseConf);
  • 特定の Red Hat Process Automation Manager プロジェクトの KIE モジュール記述子ファイル (kmodule.xml) で順次モードを有効化

    <kmodule>
      ...
      <kbase name="KBase2" default="false" sequential="true" packages="org.domain.pkg2, org.domain.pkg3" includes="KBase1">
        ...
      </kbase>
      ...
    </kmodule>

以下のオプションのいずれかを使用して、順次モードが動的アジェンダを使用するように設定します。

  • システムプロパティー drools.sequential.agendadynamic に設定:
  • プログラムを用いて KIE ベースを作成中に順次アジェンダオプションを設定:

    KieServices ks = KieServices.Factory.get();
    KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration();
    kieBaseConf.setOption(SequentialAgendaOption.DYNAMIC);
    KieBase kieBase = kieContainer.newKieBase(kieBaseConf);

順次モードを有効にすると、以下の方法でデシジョンエンジンがルールを評価します。

  1. ルールは、ルールセットの顕著性および位置によって順序付けられます。
  2. 考えられるルールの一致ごとの要素が作成されました。要素の位置が実行の順番を示しています。
  3. right-input オブジェクトメモリーを除いて、ノードメモリーは無効化されました。
  4. left-input アダプターノードの伝播は切断され、ノードを持つオブジェクトは Command オブジェクトで参照されます。Command オブジェクトは、後で実行するためにワーキングメモリーのリストに追加されます。
  5. すべてのオブジェクトがアサートされると、Command オブジェクトのリストが確認され、実行されます。
  6. リストの実行によって生じるすべての一致は、ルールのシーケンス番号に基づいて要素に追加されます。
  7. 一致を含む要素は、順次実行されます。ルール実行の最大数を設定している場合は、デシジョンエンジンがアジェンダで実行するルールの数がこの最大数を超えることはありません。

順次モードでは、LeftInputAdapterNode ノードが Command オブジェクトを作成し、これをデシジョンエンジンのワーキングメモリーリストに追加します。この Command オブジェクトには、LeftInputAdapterNode ノードおよび伝播されたオブジェクトへの参照が含まれます。これらの参照は、right-input 伝播が left-input の結合を試みる必要がないように、挿入時にあらゆる left-input 伝播を停止します。また、参照により、left-input メモリーが不要となります。

すべてのノードのメモリーはオフになっています。これには、left-input のタプルメモリーも含まれますが、right-input オブジェクトメモリーは除外されます。すべてのアサーションが終了し、すべてのオブジェクトの right-input メモリーが生成されると、デシジョンエンジンは LeftInputAdatperNode オブジェクトと Command オブジェクトのリストを繰り返します。このオブジェクトはネットワークを伝播し、right-input オブジェクトに結合しようと試みますが、left input では保持されません。

タプルをスケジュールするための優先度キューがあるアジェンダは、各ルールの要素に置き換えます。RuleTerminalNode ノードのシーケンス番号は、一致を配置する要素を示します。Command オブジェクトがすべて終了すると、要素が確認され、既存の一致が実行されます。要素内で最初と最後に生成されたセルを保持してパフォーマンスを向上します。

ネットワークが構築されると、各 RuleTerminalNode ノードは、顕著性の番号と、ネットワークに追加された順序をベースとするシーケンス番号を受け取ります。

right-input ノードメモリーは、通常、オブジェクトをすばやく削除するためのハッシュマップです。オブジェクトの削除はサポートされていないため、オブジェクトの値がインデックス化されていない場合は、Phreak がオブジェクトリストを使用します。大量のオブジェクトに対しては、インデックス化されたハッシュマップがパフォーマンスを向上させます。オブジェクトのインスタンスが少ししかないと、Phreak はインデックスの代わりにオブジェクトリストを使用します。