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