流口水:多次触发规则

Drools : Rule firing multiple times

我是 Drools 的新手,遇到了问题。

我简化了规则来展示问题:

    rule "test"

    when
        $ev     : TestEvent()

        $evList : ArrayList( size >= 3 ) from collect
                  (
                     TestEvent(linkId == $ev.getLinkId())
                  ) 
    then
       System.out.println("Rule fired!")

    end

基本上,我想计算在特定 Link 上发生的事件(Link 是一段路)。当 3 个事件发生在同一个 Link 上时,我希望触发规则。

上面的规则几乎可以工作,但是当它触发时,它会触发 3 次,每个事件一次。我只希望它触发一次。

我错过了什么?

非常感谢。

第一个模式选择任何 TestEvent,而不考虑其 linkId。如果某个linkId有n个TestEvent事实,则激活进行n次。

要限制此规则在您可以 select 任何此类 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

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