2016-06-09 42 views
0

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

我是新来的流口水。请帮助我一个场景。

场景:

  1. 出在最后20秒进入许多事件中,比较具体的事实和采取的行动。
  2. 大于20秒的事实应该不断缩回。

代码尝试:

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

试图把一些日志语句当部分,可以看到所有的事实相比,发生在工作记忆,而不只是在最后的20多岁的人进入。在一小时之后进行相同的处理后,可以看到工作记忆中的事实。

什么是具体的行为“在窗口:时间(20秒)”?

回答

0

滑动时间窗来选择事件的工作记忆中的一个子集,这并不奇怪那些不高于window:time短语指定的持续时间较旧的。

要摆脱比某段时间早的事件,请使用例如明确期满抵销。在DRL declare声明@expires(20s)或使用隐到期策略,然而,只能在STREAM模式,依赖于一套所有规则。 (后者可能很容易导致永远不会被收回的事件。)

+0

当 报警(PRINT_SOME_LOG(),getCustField( “ID”)!= currentAlarm。 getCustField(“Id”))over window:time(20s) then |||||| 我打印了一些日志,如上面的代码段所述。可以看到部分评估存储器中的所有数据,而不仅仅是最后20秒。 有什么想法?为什么这个奇怪的行为 –

+0

我怎么知道?我没有看到你的代码,我没有看到你的数据。 – laune

0

您可以使用timer来移除小于20岁以前的事件:

rule "Remove old Events" 
timer (20s) 
when 
    $a: Alarm() 
then 
    retract ($a) 
end 

和使用你的规则只收集那些尚未事件20多岁的老:

rule "First Rule" 
when 
    Alarm(...) over window:time(20s) 
then 
    ... 
end 

定时器将确保如果条件保持在定时器指定的时间您的规则才会触发。

过窗口让你拿起是一个窗口上的事件[指定时间到过去,现在]