如何通过Drools进行连续滑动窗口时间检查?

如何通过Drools进行连续滑动窗口时间检查?,drools,rule-engine,Drools,Rule Engine,我的情况是:如果我的银行账户在任何连续10分钟内提款金额超过1000美元,例如,0m-10m,然后0m1s-10m1s,然后0m2s-10m2s,这是一个滑动时间窗口,银行系统应该向我发送警告消息 那么,有人能帮我写口水法则吗 我的初步想法如下: when Number( $total : intValue, intValue >= 1000) from accumulate (Withdraw ($money : money)

我的情况是:如果我的银行账户在任何连续10分钟内提款金额超过1000美元,例如,0m-10m,然后0m1s-10m1s,然后0m2s-10m2s,这是一个滑动时间窗口,银行系统应该向我发送警告消息

那么,有人能帮我写口水法则吗

我的初步想法如下:

when
              Number( $total : intValue, intValue >= 1000)
              from accumulate (Withdraw ($money : money)
              over window:time( 10m )
              from entry-point ATMEntry,
              sum($money))
then
    System.out.println("Warning! too more withdraw:"+$total);
然而,它只会检查一次即将到来的10米。在第一个10米后,无论我插入到ATMEntry的提取对象有多少,我都不会收到警告消息

如果我在不同的会话中触发上述规则间隔,例如每1m触发一次,这会使我对如何为不同的会话向ATMEntry插入撤回对象感到困惑

那么,在我的情况下,有没有可能使用Drools来解决这个问题


谢谢,

您必须通过另一个撤销事件触发评估:

when
          Withdraw()
          Number( $total : intValue >= 1000)
              from accumulate (Withdraw ($money : money)
                   over window:time( 10m )
                   from entry-point ATMEntry,
                   sum($money))
then
    System.out.println( "Warning! " + $total );
end

如果需要单个事件,最好将它们收集到一个列表中。这也有助于以超额提款关闭一个间隔,并打开另一个间隔。这取决于规范的细节:何时发出警报,何时发出或不发出下一个警报。

谢谢您的回复。事实上,我不知道下一场比赛什么时候开始。因此,我无法将它们收集到列表中。所以,我需要每10分钟对观察者进行一次下降。例如,0m-10m,然后是0m1s-10m1s,然后是0m2s-10m2s,这是一个滑动窗口。我只需在一个会话中实时输入每个事件。Drools可以支持此功能吗?您可以编写一条规则,在撤消时触发。然后你可以在最后10分钟内找到其他人如果你看固定的时间,你可能会错过一些东西。那么,你的意思是当新的提款到来时,我需要取消规则,对吗?会议怎么样?如果我必须使用同一个会话来启动它?在这些场景中,您通常需要一个持续运行的会话。但是你可能不需要实时进行欺诈检测——你无论如何也不能把队伍派到自动取款机上。如果您定期运行此应用程序,则必须确保中断得到正确处理,即不会遗漏过多透支。