5.3. Phreak における順次モード
順次モードは、デシジョンエンジンにおける高度なルールベースの設定で、Phreak がサポートしています。順次モードでは、デシジョンエンジンは、ワーキングメモリーでの変更に関係なく、デシジョンエンジンアジェンダにリスト化された順番でルールを一度評価します。順次モードでは、デシジョンエンジンがルールのステートメント insert
、modify
、または update
をすべて無視し、ルールを単一シーケンスで実行します。その結果、ルールの実行は順次モードの方が速くなる可能性がありますが、重要な更新がルールに適用されない可能性があります。
ステートフルな KIE セッションは本来、以前呼び出された KIE セッションのデータを使用するため、順次モードが適用されるのはステートレスな KIE セッションのみとなります。ステートレスな KIE セッションを使用し、ルールを実行して、アジェンダ内の後続のルールを決定するには、順次モードを有効にしないでください。デシジョンエンジンでは、デフォルトで順次モードは無効となっています。
以下のオプションのいずれかを使用して、順次モードを有効にします。
-
システムプロパティー
drools.sequential
をtrue
に設定: プログラムを用いて KIE ベースを作成中に順次モードを有効化:
KieServices ks = KieServices.Factory.get(); KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration(); kieBaseConf.setOption(SequentialOption.YES); KieBase kieBase = kieContainer.newKieBase(kieBaseConf);
特定の Red Hat Decision 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.agenda
をdynamic
に設定: プログラムを用いて KIE ベースを作成中に順次アジェンダオプションを設定:
KieServices ks = KieServices.Factory.get(); KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration(); kieBaseConf.setOption(SequentialAgendaOption.DYNAMIC); KieBase kieBase = kieContainer.newKieBase(kieBaseConf);
順次モードを有効にすると、以下の方法でデシジョンエンジンがルールを評価します。
- ルールは、ルールセットの顕著性および位置によって順序付けられます。
- 考えられるルールの一致ごとの要素が作成されました。要素の位置が実行の順番を示しています。
- right-input オブジェクトメモリーを除いて、ノードメモリーは無効化されました。
-
left-input アダプターノードの伝播は切断され、ノードを持つオブジェクトは
Command
オブジェクトで参照されます。Command
オブジェクトは、後で実行するためにワーキングメモリーのリストに追加されます。 -
すべてのオブジェクトがアサートされると、
Command
オブジェクトのリストが確認され、実行されます。 - リストの実行によって生じるすべての一致は、ルールのシーケンス番号に基づいて要素に追加されます。
- 一致を含む要素は、順次実行されます。ルール実行の最大数を設定している場合は、デシジョンエンジンがアジェンダで実行するルールの数がこの最大数を超えることはありません。
順次モードでは、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 はインデックスの代わりにオブジェクトリストを使用します。