Drools:规则多次激活

时间:2015-06-08 10:57:27

标签: drools rule-engine

我是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次,每次发生一次。我只希望它开一次。

我错过了什么?

非常感谢提前。

2 个答案:

答案 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

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

相关问题