我正在尝试编写一条延迟射击的规则,直到最后一次射击至少15分钟。然而,Drools Fusion中的时间运算符仅允许推理关于彼此的两个事件而不是与当前时间相关的一个事件。
我想要这样的事情:
rule "some rule"
when
not LastFiredEvent(this before[0m, 15m] NOW)
…
我已经开始编写一个规则,每秒触发一次并插入一个心跳事件(也缩回之前的心跳),我可以在其他规则中使用它作为当前时间。
我发现这相当不优雅;我错过了什么或Drools Fusion真的没有东西吗?
NB。我不正在寻找延迟解雇规则或规则,只能在15分钟的倍数上开火;如果在过去17分钟内没有发生任何事情,则规则必须立即触发以响应新事件。
答案 0 :(得分:8)
虽然“NOW”的概念起初可能看起来很简单,但它不是,因为它含糊不清并且取决于它可以根据运行环境采用的不同语义。当您在STREAM模式下运行时,Drools Fusion确实有一个“现在”的概念,但它与您上面提到的不同。这里的解释有点长,所以让我们关注你的问题。
首先,你说:“我正试图写一条延迟射击的规则......”然后你说:“我不是在寻找延迟解雇规则......”所以我对什么感到困惑你需要。
如果您想延迟规则,可以使用计时器属性:
rule X
timer( int: 15m )
...
如果要在某个时间间隔内发生或未发生事件时触发规则,则可以使用滑动窗口。 E.g:
rule "Event did not happen in the last 15m"
when
not( SomeEvent() over time:window(15m) )
...
希望有所帮助。顺便说一句,尝试将您的问题发布到Drools邮件列表,因为它会更容易您得到答案。我只看到了你的帖子,因为一位朋友对我说了些什么。
干杯, 埃德森