在《Drools7 规则引擎视频教程》中已经讲到,使用modify或update的时候在某种程度上会导致死循环。
但是问题依旧存在。为什么呢?其实这跟no-loop使用的功能有关,no-loop的作用是限制因为modify等更新操作导致规则重复执行,但是有一个限定条件,是当前规则中进行更新导致当前规则重复执行。而不是防止其他规则更新相同的fact对象,导致当前规则更新。
因此,针对以上问题,不仅仅要解决当前规则自身引起的更新,还需要解决其他规则更新fact对象引起的更新。这时还需要使用ock-on-active true属性配置。
lock-on-active true这个属性,可以限制当前规则只会被执行一次,包括当前规则的重复执行不是本身触发的。是no-loop的加强版。
另外,针对这段代码的编写,这位同学还犯了另外一个错误,就是When中的判断条件。两个规则中都用了两个判断条件。$map:Map()相当于一个判断条件;Map(…)又相当于一个判断条件。其实这两个判断条件应该合并成一个,如这样的形式:$map:Map(…)。大家在使用的过程中注意不要犯类似的错误。
更多关于Drools规则引擎的视频教程和学习群组,访问此处。