我是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次,每次发生一次。我只希望它开一次。
我错过了什么?
非常感谢提前。
答案 0 :(得分:1)
第一个模式选择任何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
答案 1 :(得分:0)
我通过改变我对问题的处理方法来实现这一目标。我现在创建了Link对象,然后将事件绑定回Link。
规则最终
rule "test"
when
$link : Link()
$events : ArrayList( size >= 3 ) from collect (TestEvent(link == $link))
then
System.out.println("Rule fired!")
end
每个链接只触发一次,这就是我需要的。