85.8. イベントストリームとエントリーポイント

デシジョンエンジンは、大量のイベントをイベントストリームの形式で処理できます。DRL ルール宣言では、ストリームは エントリーポイント としても知られています。DRL ルールまたは Java アプリケーションでエントリーポイントを宣言すると、デシジョンエンジンはコンパイル時に適切な内部構造を特定して作成し、そのエントリーポイントのみからのデータを使用してそのルールを評価します。

1 つのエントリーポイント、またはストリームからのファクトは、デシジョンエンジンのワーキングメモリーにすでにあるファクトに加えて、他のエントリーポイントからのファクトに参加できます。ファクトは、常にデシジョンエンジンに入ったエントリーポイントに関連付けられたままとなっています。同じタイプのファクトは、複数のエントリーポイントからデシジョンエンジンに入ることができますが、エントリーポイント A からデシジョンエンジンに入るファクトは、エントリーポイント B からのパターンと一致することはありません。

イベントストリームには、以下の特徴があります。

  • ストリーム内のイベントは、タイムスタンプ別に並べられます。タイムスタンプは、ストリームごとにさまざまなセマンティクスを持つ場合もありますが、常に内部で並べ替えが行われます。
  • 通常、イベントストリームには大量のイベントがあります。
  • 通常、ストリームに含まれるアトミックなイベントは、それだけでは実用的ではなく、ストリームで集合的な場合にのみ実用的です。
  • イベントストリームは、同種 (単一タイプのイベントを含む) の場合も、異種 (異るタイプのイベントを含む) の場合もあります。

85.8.1. ルールデータのエントリーポイントの宣言

イベントのエントリーポイント (イベントストリーム) を宣言して、デシジョンエンジンがそのエントリーポイントのみからのデータを使用してルールを評価することが可能です。エントリーポイントは、DRL ルールで参照することで暗黙的に宣言することも、Java アプリケーションで明示的に宣言することもできます。

手順

以下のいずれかの方法を使用して、エントリーポイントを宣言します。

  • DRL ルールファイルで、挿入されたファクトの from entry-point "<name>" を指定します。

    "ATM Stream" エントリーポイントで取り消しルールを認可

    rule "Authorize withdrawal"
    when
      WithdrawRequest($ai : accountId, $am : amount) from entry-point "ATM Stream"
      CheckingAccount(accountId == $ai, balance > $am)
    then
      // Authorize withdrawal.
    end

    "Branch Stream" エントリーポイントで手数料ルールを適用

    rule "Apply fee on withdraws on branches"
    when
      WithdrawRequest($ai : accountId, processed == true) from entry-point "Branch Stream"
      CheckingAccount(accountId == $ai)
    then
      // Apply a $2 fee on the account.
    end

    銀行取引アプリケーションにおける両方の DRL ルールのサンプルは、イベント WithdrawalRequest にファクト CheckingAccount を挿入しますが、エントリーポイントは異なります。実行時にデシジョンエンジンは、"ATM Stream" エントリーポイントのみからのデータを使用して Authorize withdrawal ルールを評価し、"Branch Stream" エントリーポイントのみからのデータを使用して Apply fee ルールを評価します。"ATM Stream" に挿入されたイベントは、"Apply fee" ルールのパターンと一致することはありません。また、"Branch Stream" に挿入されたイベントは、"Authorize withdrawal rule" のパターンと一致することはありません。

  • Java アプリケーションコードで、getEntryPoint() メソッドを使用して EntryPoint オブジェクトを指定および取得し、以下に従ってファクトをそのエントリーポイントに挿入します。

    EntryPoint オブジェクトと挿入されたファクトを持つ Java アプリケーションコード

    import org.kie.api.runtime.KieSession;
    import org.kie.api.runtime.rule.EntryPoint;
    
    // Create your KIE base and KIE session as usual.
    KieSession session = ...
    
    // Create a reference to the entry point.
    EntryPoint atmStream = session.getEntryPoint("ATM Stream");
    
    // Start inserting your facts into the entry point.
    atmStream.insert(aWithdrawRequest);

    from entry-point "ATM Stream" を指定する DRL ルールはすべて、このエントリーポイントのデータのみに基づいて評価されます。