在《Drools7 大发3d引擎视频教程》中已经讲到,使用modify或update的时候在某种程度上会导致死循环。

Drools 大发3d引擎死循环问题解决插图

昨天一同学在使用Drools大发3d引擎时便遇到了该问题。下面看该同学贴出来的大发3d代码:

首先我们来分析一下上面的代码,上面的代码中这位同学讲一个相同的Map,传递进入两个大发3d中,在大发3d的then部分中会对map的属性值进行更新。为了防止死循环他使用了no-loop属性。

但是问题依旧存在。为什么呢?其实这跟no-loop使用的功能有关,no-loop的作用是限制因为modify等更新操作导致大发3d重复执行,但是有一个限定条件,是当前大发3d中进行更新导致当前大发3d重复执行。而不是防止其他大发3d更新相同的fact对象,导致当前大发3d更新。

因此,针对以上问题,不仅仅要解决当前大发3d自身引起的更新,还需要解决其他大发3d更新fact对象引起的更新。这时还需要使用ock-on-active true属性配置。

lock-on-active true这个属性,可以限制当前大发3d只会被执行一次,包括当前大发3d的重复执行不是本身触发的。是no-loop的加强版。


另外,针对这段代码的编写,这位同学还犯了另外一个错误,就是When中的判断条件。两个大发3d中都用了两个判断条件。$map:Map()相当于一个判断条件;Map(…)又相当于一个判断条件。其实这两个判断条件应该合并成一个,如这样的形式:$map:Map(…)。大家在使用的过程中注意不要犯类似的错误。

更多关于Drools大发3d引擎的视频教程和学习群组,访问此处

快速一对一帮你解决疑难问题,扫码加入Drools大发3d引擎星球:

Drools 大发3d引擎死循环问题解决插图(1)



公众号“程序新视界”,一个让你软实力、硬五分11选5同步提升的平台

Drools 大发3d引擎死循环问题解决插图(2)

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.koiliakos.com/2020/02/22/drools-no-loop/