流口水:多次发射规则



我刚开始使用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

每个链接只触发一次,这正是我需要的。

最新更新