繁体   English   中英

如何在流口水中实现时间持久性?

[英]how to implement time persistence in drools?

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

if (条件为真X 秒) then doSomething()

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

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

在流模式下,Drools 有一组时间运算符(链接到 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 )时,第一个条件触发。

第二个条件是魔法发生的地方。 第二个条件将只触发,如果它在10分钟内收到以下接收的小于100度的温度事件$t

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

或者,您可以在 10 分钟内使用滑动窗口查看最低温度是否低于 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 的这一部分,因此您可能会找到更适合您的用例的另一种方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM