6

我正在尝试编写一条规则,将触发延迟到自上次触发以来至少 15 分钟之后。然而,Drools Fusion 中的时间算子只允许推理两个彼此相关的事件,而不是一个与当前时间相关的事件。

我想要这样的东西:

rule "some rule"
when
    not LastFiredEvent(this before[0m, 15m] NOW)
    …

我已经写了一个规则,它每秒触发并插入一个心跳事件(也收回之前的心跳),我可以在其他规则中使用它作为当前时间。

我觉得这很不雅;我是否遗漏了什么或者 Drools Fusion 真的没有什么东西?

注意。我不是在寻找延迟触发的规则或只能在 15 分钟的倍数内触发的规则;如果过去 17 分钟内没有发生任何事情,则规则必须立即触发以响应新事件。

4

1 回答 1

8

尽管“NOW”的概念乍一看似乎很简单,但实际上并非如此,因为它是模棱两可的,并且取决于它可以根据运行环境采取的不同语义。当您在 STREAM 模式下运行Drools Fusion 时,它确实具有“现在”的概念,但它与您上面所要求的不同。这里的解释有点长,所以让我们专注于你的问题。

首先,您说:“我正在尝试编写延迟触发的规则……”然后您说:“我不是在寻找延迟触发规则……”,所以我对您需要什么感到困惑。

如果要延迟规则,可以使用 timer 属性:

rule X
   timer( int: 15m )
...

如果您想在某个时间间隔内发生或未发生事件时触发规则,您可以使用滑动窗口。例如:

rule "Event did not happen in the last 15m"
when
   not( SomeEvent() over time:window(15m) )
...

希望有帮助。顺便说一句,尝试将您的问题发布到 Drools 邮件列表,因为您会更容易获得答案。我只看到你的帖子,因为一个朋友 ping 我关于它。

干杯,埃德森

于 2011-01-17T08:20:49.013 回答