《Drools 7 规则引擎教程》番外篇-规则条件匹配机制

简介: 《Drools 7 规则引擎教程》番外篇-规则条件匹配机制

问题场景

QQ技术群(715840230)中有同学遇到这一个问题场景:在多条规则(比如3条)的when中使用了一个相同的静态方法,并在静态方法中打印相关的日志信息。同时,使用了AgendaFilter对规则进行了过滤。也就是说只包含部分规则(比如匹配一条规则的名字)的使用。


在这种场景下,匹配到的那条规则会正常触发,这个毫无疑问,但执行规则引擎之后会有一个附加情况,那就是使用同一静态方法的三条规则都调用了这个静态方法,打印了日志。


按照常理,使用了AgendaFilter对规则进行了过滤,只会进入一条规则的when判断,怎么会被调用三次呢?


问题原因

问题出现是由于规则引擎的处理模式导致的。规则引擎在执行AgendaFilter之前已经将所有的规则文件的约束(when)部分代码进行判断,计算出符合条件的规则。这样做的好处是可以综合利用条件和FACT对象等资源,减少总体的约束判断的工作量。从整体上来说节省了时间,但是对于只使用单个规则的session来说可能会有一定的性能瓶颈。


这样的机制还有一个需要注意的问题,比如两个规则的when部分使用到了不同的参数,在调用规则时只传递了一个规则的参数,另外一个规则的参数未传递(因为我们不需要),这是那个未传递参数的规则可能会抛出异常,影响正常的规则处理。


这个问题在drools5.x版本中是恶汉模式,急切的创建匹配,在drools6.x版本中已经改成懒汉模式,只有在你尝试去匹配规则时才会做约束条件的判断匹配工作。


那么,使用agenda-group或其他group或enabled属性控制,是否能达到分组的效果。然而,答案是否定的。这些属性的生效时机依旧在约束条件判断之后。


解决方案

对于这个问题并没有很好的解决方案。但可以使用简单粗暴的方式,就是根据规则的package进行划分,创建不同的session,尽量减少不同规则之间的相互影响。


Drools技术视频

CSDN学院:《Drools7规则引擎进阶教程》


CSDN学院:《Drools7规则引擎入门教程》


CSDN学院:《Drools7系列优惠套餐》


本人博客:《点击此处》


QQ群:715840230(2群),欢迎大家加入讨论。**


目录
相关文章
|
缓存 Java 编译器
小姐姐都能看懂的Happens-before规则,你还愣住了
众所周知的并发编程三大特性;原子性、可见性、有序性;但是这些特性的起源你知道吗? 可见性:正是由于CPU存在缓存,导致了变量修改的不可见性
|
消息中间件 人工智能 算法
很全的敏感词匹配系统的设计与实践(1)
很全的敏感词匹配系统的设计与实践(1)
|
存储 JavaScript 前端开发
一篇文章带你搞懂 this 的四个绑定规则 ✍
大家好,我是 CoderBin,本文将给大家分享 JavaScript 中关于 this 指向的相关内容,如果文中有任何不对的地方欢迎在评论区留言指正,如果对同学们有帮助的欢迎点赞收藏,你们的支持就是我最大的动力,谢谢🌻
868 9
一篇文章带你搞懂 this 的四个绑定规则 ✍
|
前端开发
前端学习案例14-正则的优先级和学习建议
前端学习案例14-正则的优先级和学习建议
72 0
前端学习案例14-正则的优先级和学习建议
|
前端开发
前端学习笔记202303学习笔记第五天-使用全局过滤器过滤时间
前端学习笔记202303学习笔记第五天-使用全局过滤器过滤时间
65 0
|
存储 算法
很全的敏感词匹配系统的设计与实践(2)
很全的敏感词匹配系统的设计与实践(2)
|
Java 数据库
JavaWeb-过滤器Filter学习(四)敏感词过滤实例
JavaWeb-过滤器Filter学习(四)敏感词过滤实例
655 0
JavaWeb-过滤器Filter学习(四)敏感词过滤实例
《Drools7.0.0.Final规则引擎教程》番外实例篇——默认条件的陷阱
《Drools7.0.0.Final规则引擎教程》番外实例篇——默认条件的陷阱
164 0
|
Java
《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件
《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件
197 0
|
Java
《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件
《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件
219 0