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 秒,并排除绑定到 $h
的 Heartbeat
事件,以便可以执行该规则。要执行规则,必须明确排除绑定事件 $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