82.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>
82.4.1. 决策引擎流模式中的负模式 复制链接链接已复制到粘贴板!
负模式是不符合的条件的模式。例如,如果检测到触发且没有激活 sprinkler,以下 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 秒发生一次 Heartbeat 事件。如果没有发生预期的事件,则执行该规则。此规则在第一个模式和负模式中使用同一类型的对象。负模式具有临时约束,在执行并排除绑定到 $h 的 Heartbeat 事件前等待 0 到 10 秒,以便执行该规则。必须明确排除绑定事件 $h 才能执行规则,因为临时约束 [0s, …] 不本质上排除该事件再次匹配。
触发警报规则排除在负模式中的绑定事件(仅限流模式)
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