85.8. 事件流和入口点

决策引擎以事件流的形式处理大量事件。在 DRL 规则声明中,流也称为 入口点。当您在 DRL 规则或 Java 应用程序中声明一个入口点时,决策引擎在编译时标识并创建正确的内部结构,以仅评估该规则。

个入口点或流中的事实(fact)也可以加入决策引擎工作内存中的任何其他入口点的事实。事实始终与输入决策引擎的入口点保持关联。同一类型的事实可以通过几个入口点输入决策引擎,但通过入口点 A 进入决策引擎的事实永远不会与入口点 B 的模式匹配。

事件源有以下特征:

  • 流中的事件按照时间戳排序。时间戳可能有不同的语义,但这些语义始终在内部排序。
  • 活动流通常具有大量事件。
  • 流中的 Atomic 事件通常不会单独使用,仅在流中集中使用。
  • 事件流可以是同构,并且包含单一类型的事件,也可以是异构类型,并且包含不同类型的事件。

85.8.1. 为规则数据声明入口点

您可以为事件声明入口点(事件流),以便决策引擎仅使用该入口点中的数据来评估规则。您可以在 DRL 规则或您的 Java 应用程序中引用一个入口点,以隐式声明该入口点。

流程

使用以下方法之一来声明入口点:

  • 在 DRL 规则文件中,为插入的事实 从入口点 "<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,其事实 检查帐户,但来自不同入口点。在运行时,决策引擎仅使用 "ATM Stream" 入口点中的数据来评估 授权 撤回规则,并使用仅来自 "Branch Stream" 入口点中的数据评估 应用费用 规则。插入到 "ATM Stream" 的任何事件都无法匹配 "应用费用" 规则的模式,并且插入到 "Branch Stream" 的任何事件都无法匹配 "Authorizeraw" 的模式。

  • 在 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);

    然后,任何从 入口点"ATM Stream"指定的 DRL 规则仅根据此入口点中的数据进行评估。