Drools:滑动窗口:基于时间:在给定时间后缩回

时间:2016-06-09 03:02:45

标签: java time drools

民间,

我是流口水的新手。请帮我解决一个场景。

情境:

  1. 在过去20秒内输入的许多事件中,比较具体事实并采取行动。
  2. 超过20秒的事实应该继续收回。
  3. 代码尝试:

    rule "First Rule"
        when
            Alarm(getCustField("Id") != currentAlarm.getCustField("Id")) over window:time(20s) 
        then
            ............
            ............
    

    尝试在部分时添加一些日志语句,并且可以看到与工作记忆中的所有事实发生的比较,而不仅仅是输入过去的20s。在经过一小时的努力之后,可以看到工作记忆中的事实。

    "在窗口上的确切行为:时间(20秒)"?

2 个答案:

答案 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 可让您选择窗口上的事件[现在指定的时间,现在]