《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
5、Drools规则引擎-.drl文件的规则语法
上一章我们讲了Drools的入门,可能很多人看到.drl的规则文件的时候,一脸蒙蔽,本章我们来讲一下规则引擎对应的规则语法
482 0
|
5月前
|
安全 数据安全/隐私保护
seliunx 基础规则介绍
seliunx 基础规则介绍
|
5月前
|
移动开发 前端开发 数据库
ruoyi-nbcio 基于flowable规则的多重并发网关的任意跳转
ruoyi-nbcio 基于flowable规则的多重并发网关的任意跳转
117 0
|
5月前
编程笔记 00 目标规则
编程笔记 00 目标规则
|
5月前
|
XML 算法 C语言
【C/C++ 静态代码检查工具 Cppcheck 】Cppcheck 检测器列表和检查规则大全一览
【C/C++ 静态代码检查工具 Cppcheck 】Cppcheck 检测器列表和检查规则大全一览
380 0
|
12月前
【每日一记】ACL基本概念(匹配流量、路由条目、书写、规则.....)
【每日一记】ACL基本概念(匹配流量、路由条目、书写、规则.....)
394 1
合成进阶奖励模式系统开发搭建源码规则解析
合成进阶奖励模式系统开发搭建源码规则解析
|
消息中间件 人工智能 算法
很全的敏感词匹配系统的设计与实践(1)
很全的敏感词匹配系统的设计与实践(1)
|
存储 算法
很全的敏感词匹配系统的设计与实践(2)
很全的敏感词匹配系统的设计与实践(2)
|
安全 Java 索引
6、Drools规则引擎-.drl文件的规则语法二
salience | 定义规则优先级的整数,数值越大,优先级越高 enabled | 规则启用开关 date-effective | 包含日期和时间定义的字符串。仅当当前日期和时间在date-effective属性之后时,才能激活该规则。
198 0