85.9. 滑动时间窗或长度

在流模式中,决策引擎可以从指定滑动时间或长度窗口处理事件。滑动时间窗是可以处理事件的指定时间段。滑动长度窗口是可以处理的指定数量事件。当您在 DRL 规则或 Java 应用程序中声明一个滑动窗口时,在决策引擎编译时,标识并创建正确的内部结构,以仅使用滑动窗口来评估该规则。

例如,以下 DRL 规则片断指示决策引擎只处理过去 2 分钟(指定时间窗)或只处理最后 10 个库存点(光纤通道窗口)中的库存点:

来自最后 2 分钟的进程库存点(指定时间窗)

StockPoint() over window:time(2m)

处理最后 10 个库存点(计算长度窗口)

StockPoint() over window:length(10)

85.9.1. 为规则数据声明滑动窗口

您可以为事件声明一个时间窗口(时间流)或长度(发生次数),以便决策引擎仅使用该窗口中的数据来评估规则。

流程

在 DRL 规则文件中,为插入的事实指定 window:<time_or_length>(<value>)

例如,下面两个 DRL 规则会基于平均温度激活触发警报。但是,第一条规则使用一个滑动时间窗来计算最近 10 分钟的平均时间,第二个规则使用了滑动长度窗口来计算过去一百个温度读数的平均值。

平均温度超过滑动时间窗

rule "Sound the alarm if temperature rises above threshold"
when
  TemperatureThreshold($max : max)
  Number(doubleValue > $max) from accumulate(
    SensorReading($temp : temperature) over window:time(10m),
    average($temp))
then
  // Sound the alarm.
end

平均温度超过滑动长度窗口

rule "Sound the alarm if temperature rises above threshold"
when
  TemperatureThreshold($max : max)
  Number(doubleValue > $max) from accumulate(
    SensorReading($temp : temperature) over window:length(100),
    average($temp))
then
  // Sound the alarm.
end

决策引擎丢弃任何超过 10 分钟以上的 SensorReading 事件,或者并非最后一百阅读的一部分,继续重新计算平均值,或实时读取"隐藏"转发。

决策引擎不会自动从 KIE 会话中删除过时的事件,因为其他规则没有滑动窗口声明可能依赖于这些事件。决策引擎将事件存储在 KIE 会话中,直到事件被显式规则声明过期,或者在基于 KIE 基础中的数据的决策引擎内隐式原因。