我刚开始使用Drools,遇到了一个问题。
我已经简化了规则来显示这个问题:
rule "test"
when
$ev : TestEvent()
$evList : ArrayList( size >= 3 ) from collect
(
TestEvent(linkId == $ev.getLinkId())
)
then
System.out.println("Rule fired!")
end
基本上,我想要计算特定链接上发生的事件(链接是一段道路)。当同一链接上发生3个事件时,我希望触发规则。
上面的规则几乎是有效的,但是当它触发时,它会触发3次,每个事件一次。我只想让它开火一次。
我错过了什么?
提前感谢。
第一个模式选择任何TestEvent,而不考虑它的linkId。如果某个linkId有n个TestEvent事实,则激活进行n次。
要限制此规则只触发一次,您可以从任何这样的n组中选择单个TestEvent。任何具有唯一有序值的属性都可以使用,如果您有事件,也可以使用事件时间戳。
rule "test"
when
$ev: TestEvent( $lid: linkId )
not TestEvent( linkId == $lid, this before $ev )
$evList : ArrayList( size >= 3 ) from collect
(
TestEvent(linkId == $lid)
)
then
System.out.println("Rule fired!")
end
我通过改变解决问题的方法使其工作。我现在已经创建了Link对象,然后将事件绑定回Link。
规则结束
rule "test"
when
$link : Link()
$events : ArrayList( size >= 3 ) from collect (TestEvent(link == $link))
then
System.out.println("Rule fired!")
end
每个链接只触发一次,这正是我需要的。