85.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 base 属性来指定云模式:

使用项目 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 base 属性来指定流模式:

使用项目 kmodule.xml 文件设置流模式

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

85.4.1. 决策引擎流模式中的负模式

负模式是不满足的条件的模式。例如,如果检测到一个触发器且未激活 sprinkler,则以下 DRL 规则激活触发警报:

使用负模式触发警报规则

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

在云模式中,决策引擎会预先识别所有事实(常规事实和事件),并立即评估负模式。在流模式中,决策引擎可以支持事实上的临时限制,以便在激活规则前等待设定时间。

流模式中的相同示例规则照常激活 fire 警报,但应用 10 秒的延迟。

触发警报规则,具有负模式和时间延迟(仅限流模式)

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

以下修改的 fire 警报规则要求每 10 秒发生一 个 Heartbeat 事件。如果没有发生预期的事件,则会执行该规则。此规则在第一个模式和负模式中使用相同的对象类型。负模式具有临时限制,在执行前等待 0 到 10 秒,并排除绑定到 $hHeartbeat 事件,以便可以执行该规则。要执行规则,必须明确排除绑定事件 $h,因为临时约束 [0s, …​] 不严格排除该事件被重新匹配。

fire 警报规则排除了负模式(仅流模式)中的绑定事件。

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