我在Drools 4.0.7中遇到了一些奇怪的行为,但也许这只是因为我不明白Drools是如何工作的。假设有一个类“A”,它有一个叫做“property”的属性。
作为事实,我有以下A列表: A1,属性= 123 A2,财产= 345 A3,property = 123
我有以下两条规则:
rule "Rule 1 - Remove all A's that have property set to 123"
salience 1000
lock-on-active true
when
$listOfAs : ArrayList collect(A( property == "123" ))
then
for (Object a: $listOfAs ) {
retract (a)
}
end
rule "Rule 2 - Do stuff with remaining A's"
salience 900
lock-on-active true
when
$listOfAs : ArrayList collect(A())
then
...
end
我的理解是“规则1”将具有属性的A类的事实移除到123.当它到达“规则2”时,“listOfAs”不应该只剩下那个A(即一个)其中property属性设置为“345”)。我注意到的是,“规则2”根本就没有执行,即使我假设还有一个“A”对象尚未撤回。如果我注释掉“撤回”,它会执行“规则2”罚款。
我错过了一些关于这些规则的工作吗?
感谢。 贾斯汀
答案 0 :(得分:1)
我怀疑这里的问题是使用'锁定活动'。鉴于第一条规则已激活,它会阻止其他规则也被激活。
根据docs lock-on-active是:
“布尔值。”true“禁止在同一规则流或议程组中设置此标志的所有规则的其他激活。”