【问题标题】:how to implement time persistence in drools?如何在drools中实现时间持久性?
【发布时间】:2020-08-27 09:18:27
【问题描述】:

我是流口水的新手,我想知道是否有办法编写及时表达持久性的规则:

如果(条件为真持续 X 秒)则 doSomething()

Rule "Example"
when
  r: Room(Temperature > 100 for 10 minutes )
then
  doSomething()
end

【问题讨论】:

    标签: java drools rules


    【解决方案1】:

    触发 Drools 规则有两种模式——默认为“云”模式,我们在单个时间点评估工作内存中的所有事实。这是触发规则的最古老和最常见的方式。另一种模式是“流”模式,数据连续播放,Drools 引擎知道时间。

    在流模式下,Drools 有一组 temporal operators(链接到 Drools 文档),可用于针对随时间发生的事实编写条件。

    您可以将时间运算符用于您的用例的一种方法如下:

    rule "Detect temperature over 100 for 10 minutes"
    when
      $t: Temperature(this >= 100) from entry-point "TemperatureStream"
      not(
        Temperature(
          this != $t, 
          this < 100,
          this after[0s,10m] $t) from entry-point "TemperatureStream")
    then
      doSomething()
    end
    

    这个简单的规则要求您通过某种外部机制从入口点 (TemperatureStream) 发送温度事件。当它检测到温度超过 100 度时(实例 $t),第一个条件触发。

    第二个条件是魔法发生的地方。第二个条件只有在收到$t 后的 10 分钟内没有收到温度事件低于 100 度时才会触发。

    当您的监控应用程序发送温度事件时,每超过 100 个都会触发第一个条件,然后开始监控流以查看第二个条件是否成立。如果是这样,规则的后果将触发。否则规则匹配将被丢弃。

    或者,您可以在 10 分钟内使用 sliding window 来查看最低温度是否曾降至 100 以下。

    rule "Detect temperature over 100 for 10 minutes - sliding window"
    when
      not(
        Number(doubleValue < 100) from accumulate(
          Room( $temperature: Temperature ) over window:time(10m),
          min( $temperature )
        )
      )
    then
      doSomething()
    end
    

    这里,window:time(10m) 是一个 10 分钟的滑动窗口。与另一种解决方案不同的是,它会在每个事件进入时对其进行观察,然后尝试检查第二个条件是否匹配,这个解决方案只是查看一段时间内的所有事件。如果整个窗口的最低温度从未低于 100,则右侧触发。

    可能还有其他方法可以做到这一点,这只是我临时想到的两种。该文档特别适合 Drools 的这一部分,因此您可能会找到另一种更适合您的用例的方法。

    【讨论】:

    • 非常感谢!这些方法是否使用会话时钟来评估数据时间戳?温度流中的数据有自己的时间戳,所以是否可以在 [0s,10m] $t.timestamp 之后写入类似 `this.timestamp` 的内容?我希望数据不是基于插入入口点的时间来评估的,而是基于它自己的时间戳。
    • 您可以在 Drools 文档here 中阅读有关时钟系统的信息。默认情况下,它使用“实时”,它利用系统时钟。还有一个“伪”系统,您可以从应用程序中控制它(这在测试时间约束时很有用。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多