84.4. デシジョンエンジンのイベント処理モード

デシジョンエンジンは、クラウドモードまたはストリームモードで実行します。クラウドモードでは、デシジョンエンジンは、ファクトを、時間に依存せず、特定の順序で、時間的な制約のないファクトとして処理します。ストリームモードでは、デシジョンエンジンは、ファクトをリアルタイムまたはほぼリアルタイムで、強力な時間的制約のあるイベントとして処理します。ストリームモードは同期を使用して、Red Hat Process Automation Manager でのイベント処理を可能にします。

クラウドモード

クラウドモードは、デシジョンエンジンのデフォルトの動作モードです。クラウドモードでは、デシジョンエンジンはイベントを順不同のクラウドとして扱います。イベントには依然としてタイムスタンプがありますが、クラウドモードでは現在の時刻が無視されるため、クラウドモードで実行されているデシジョンエンジンは、タイムスタンプから関連性を引き出すことができません。このモードでは、ルール制約を使用して一致するタプルを検索し、ルールを有効にして実行します。

クラウドモードでは、ファクトに対して追加要件を課すことは一切ありません。ただし、このモードのデシジョンエンジンには時間の概念がないため、スライディングウィンドウや自動ライフサイクル管理などの時間機能は使用できません。クラウドモードでは、イベントが必要なくなると、明示的にイベントを取り消す必要があります。

クラウドモードでは、以下の要件が課されることはありません。

  • デシジョンエンジンには時間の概念がないため、クロックの同期はありません
  • デシジョンエンジンは、イベントを順不同のクラウドとして処理するため、イベントの順序付けはありませんが、デシジョンエンジンは順不同のクラウドに対してルールを一致させます。

関連する設定ファイルでシステムプロパティーを設定するか、または Java クライアント API を使用して、クラウドモードを指定できます。

システムプロパティーを使用してクラウドモードを設定

drools.eventProcessingMode=cloud

Java クライアント API を使用してクラウドモードを設定

import org.kie.api.conf.EventProcessingOption;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices.Factory;

KieBaseConfiguration config = KieServices.Factory.get().newKieBaseConfiguration();

config.setOption(EventProcessingOption.CLOUD);

特定の Red Hat Process Automation Manager プロジェクトの KIE モジュール記述子ファイル (kmodule.xml) の eventProcessingMode="<mode>" KIE ベース属性を使用して、クラウドモードを指定することもできます。

プロジェクト kmodule.xml ファイルを使用してクラウドモードを設定

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

ストリームモード

イベントがデシジョンエンジンに挿入されると、デシジョンエンジンは、ストリームモードを使用することで、イベントを時系列およびリアルタイムに処理できます。ストリームモードでは、(異なるストリームのイベントを時系列で処理できるように) デシジョンエンジンはイベントのストリームを同期し、時間または長さのスライディングウィンドウを実装し、自動ライフサイクル管理を可能にします。

以下の要件がストリームモードに適用されます。

  • 各ストリームのイベントは、時系列に並べる必要があります。
  • イベントストリームを同期するには、セッションクロックが必要です。
注記

お使いのアプリケーションが、ストリーム間でイベントの順序付けを強制する必要はありませんが、同期されていないイベントストリームを使用すると、予期しない結果が生じる可能性があります。

関連する設定ファイルでシステムプロパティーを設定するか、または Java クライアント API を使用して、ストリームモードを指定できます。

システムプロパティーを使用してストリームモードを設定

drools.eventProcessingMode=stream

Java クライアント API を使用してストリームモードを設定

import org.kie.api.conf.EventProcessingOption;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices.Factory;

KieBaseConfiguration config = KieServices.Factory.get().newKieBaseConfiguration();

config.setOption(EventProcessingOption.STREAM);

特定の Red Hat Process Automation Manager プロジェクトの KIE モジュール記述子ファイル (kmodule.xml) の eventProcessingMode="<mode>" KIE ベース属性を使用して、ストリームモードを指定することもできます。

プロジェクト kmodule.xml ファイルを使用してストリームモードを設定

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

84.4.1. デシジョンエンジンのストリームモードにおける負のパターン

負のパターンは、条件が一致しない場合のパターンです。たとえば、以下の DRL ルールは、火災が検知されてもスプリンクラーが有効になっていない場合に、火災報知機を有効にします。

負のパターンでの火災報知機ルール

rule "Sound the alarm"
when
  $f : FireDetected()
  not(SprinklerActivated())
then
  // Sound the alarm.
end

クラウドモードでは、デシジョンエンジンはすべてのファクト (通常のファクトとイベント) が前もって知らされているものと想定し、負のパターンをすぐに評価します。ストリームモードでは、意思決定エンジンは、ルールをアクティブ化する前に設定された時間待機するファクトの時間的制約をサポートできます。

ストリームモードでは、同じ例のルールは、通常どおりに火災報知機を有効にしますが、10 秒間の遅延が適用されます。

負のパターンと遅延時間のある火災報知機ルール (ストリームモードのみ)

rule "Sound the alarm"
when
  $f : FireDetected()
  not(SprinklerActivated(this after[0s,10s] $f))
then
  // Sound the alarm.
end

以下の修正された火災報知器ルールは、10 秒ごとに 1 つの Heartbeat イベントが発生することを想定しています。想定されるイベントが発生しないと、ルールが実行します。このルールは、最初のパターンと負のパターンの両方で同じタイプのオブジェクトを使用します。負のパターンには、実行前に 0 秒から 10 秒待機する一時的な制約があり、$h にバインドされている Heartbeat イベントを除外して、ルールを実行できるようにします。時間的制約 [0s, …​] が本質的にそのイベントの再照合を除外しないため、ルールを実行するには、バインドされたイベント $h を明示的に除外する必要があります。

負のパターンでバインドされたイベントを除外する火災報知器ルール (ストリームモードのみ)

rule "Sound the alarm"
when
  $h: Heartbeat() from entry-point "MonitoringStream"
  not(Heartbeat(this != $h, this after[0s,10s] $h) from entry-point "MonitoringStream")
then
  // Sound the alarm.
end