流口水:多次触发规则
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 只触发一次,这正是我需要的。
我是 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 只触发一次,这正是我需要的。