2010-07-16 84 views
3

我在Drools 4.0.7中遇到了一些奇怪的行为,但也许这只是因为我不明白Drools是如何工作的。假设有一个类“A”,它有一个名为“property”的属性。Drools撤回导致规则不起火

作为事实,我有以下A的列表: A1,属性= 123 A2,属性= 345 A3,属性= 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(即属性被设置为“345”)。我注意到的是,即使我假设仍然有一个“A”对象没有被收回,“规则2”根本不会执行。如果我注释掉“收回”,它会执行“规则2”罚款。

我错过了关于这些规则的工作吗?

谢谢。 Justin

+0

你让它工作?我正在观察Drools 5.4中的类似行为。 – 2013-02-28 01:23:26

回答

1

我怀疑这里的问题是使用'lock-on-active'。鉴于第一条规则已被激活,它会阻止其他规则也被激活。

根据该文档锁定上活性是:

“一个布尔值‘真’抑制的所有规则的附加激活与该标志相同的规则流或议程组内设定”。