民间,
我是流口水的新手。请帮我解决一个场景。
情境:
代码尝试:
rule "First Rule"
when
Alarm(getCustField("Id") != currentAlarm.getCustField("Id")) over window:time(20s)
then
............
............
尝试在部分时添加一些日志语句,并且可以看到与工作记忆中的所有事实发生的比较,而不仅仅是输入过去的20s。在经过一小时的努力之后,可以看到工作记忆中的事实。
"在窗口上的确切行为:时间(20秒)"?
答案 0 :(得分:0)
滑动时间窗口选择工作记忆中的事件子集,毫不奇怪,这些事件不会超过window:time
短语中指定的持续时间。
要删除超过某些时间的事件,请使用以下方法设置显式到期偏移。 DRL @expires(20s)
语句中的declare
或使用隐式过期策略,但该策略仅适用于STREAM模式并依赖于所有规则集。 (后者可能很容易导致事件永远不会被撤回。)
答案 1 :(得分:0)
您可以使用timer
删除超过20岁的事件:
rule "Remove old Events"
timer (20s)
when
$a: Alarm()
then
retract ($a)
end
并使用您的规则仅收集尚未成立的事件:
rule "First Rule"
when
Alarm(...) over window:time(20s)
then
...
end
计时器将确保只有条件在计时器上指定的时间内保持您的规则才会触发。
over-window 可让您选择窗口上的事件[现在指定的时间,现在]