如何在 drools 中实现时间持久化?
how to implement time persistence in drools?
我是 drools 的新手,我想知道是否有一种方法可以编写表达时间持久性的规则:
if(条件为真 X 秒)然后 doSomething()
Rule "Example"
when
r: Room(Temperature > 100 for 10 minutes )
then
doSomething()
end
有两种触发 Drools 规则的模式——默认模式是“云”模式,我们在单个时间点评估工作记忆中的所有事实。这是触发规则的最古老和最常见的方式。另一种模式是“流”模式,数据连续播放,Drools 引擎知道时间。
在流模式下,Drools 有一组 temporal operators(link 到 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
),第一个条件触发。
第二个条件是奇迹发生的地方。第二个条件只有在 not 收到 less 的温度事件后 10 分钟内收到 [=13] 小于 100 度时才会触发=].
当您的监控应用程序发送温度事件时,每个超过 100 的温度事件都会触发第一个条件,然后开始监控流以查看第二个是否成立。如果是这样,规则的后果将被触发。否则规则匹配将被丢弃。
或者,您可以使用 sliding window 超过 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 分钟内滑动 window。与其他解决方案不同,后者甚至在每个事件进入时都对其进行观察,然后尝试检查第二个条件是否匹配,这个解决方案只是简单地查看一段时间内的所有事件。如果整个 window 的最低温度从未低于 100,则右侧触发。
可能还有其他方法可以做到这一点,这只是我随手想到的两种方法。该文档对于 Drools 的这一部分特别有用,因此您可能会找到另一种更适合您的用例的方法。
我是 drools 的新手,我想知道是否有一种方法可以编写表达时间持久性的规则:
if(条件为真 X 秒)然后 doSomething()
Rule "Example"
when
r: Room(Temperature > 100 for 10 minutes )
then
doSomething()
end
有两种触发 Drools 规则的模式——默认模式是“云”模式,我们在单个时间点评估工作记忆中的所有事实。这是触发规则的最古老和最常见的方式。另一种模式是“流”模式,数据连续播放,Drools 引擎知道时间。
在流模式下,Drools 有一组 temporal operators(link 到 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
),第一个条件触发。
第二个条件是奇迹发生的地方。第二个条件只有在 not 收到 less 的温度事件后 10 分钟内收到 [=13] 小于 100 度时才会触发=].
当您的监控应用程序发送温度事件时,每个超过 100 的温度事件都会触发第一个条件,然后开始监控流以查看第二个是否成立。如果是这样,规则的后果将被触发。否则规则匹配将被丢弃。
或者,您可以使用 sliding window 超过 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 分钟内滑动 window。与其他解决方案不同,后者甚至在每个事件进入时都对其进行观察,然后尝试检查第二个条件是否匹配,这个解决方案只是简单地查看一段时间内的所有事件。如果整个 window 的最低温度从未低于 100,则右侧触发。
可能还有其他方法可以做到这一点,这只是我随手想到的两种方法。该文档对于 Drools 的这一部分特别有用,因此您可能会找到另一种更适合您的用例的方法。