《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群),欢迎大家加入讨论。**


目录
相关文章
|
人工智能 自然语言处理 API
向量检索服务实践测评
向量检索服务是一种基于阿里云自研的向量引擎 Proxima 内核,提供具备水平拓展、全托管、云原生的高效向量检索服务。向量检索服务将强大的向量管理、查询等能力,通过简洁易用的 SDK/API 接口透出,方便在大模型知识库搭建、多模态 AI 搜索等多种应用场景上集成。
138993 5
|
SQL 存储 JSON
MySQL执行请求报错 Error: Row size too large (>8126)
最近遇到一个业务问题,在执行一个大的业务查询时会抛出异常报错,所以今天就总结一下 Row size too large (>8126) 报错的相关问题。
|
算法 安全 Java
z3-solver求解器
一个非常高级的工具,SMT求解器。应用领域非常广,解各类方程,解各类编程问题(例如解数独),解逻辑题等都不在话下。
|
PyTorch Go 算法框架/工具
YOLOv8代码上线,官方宣布将发布论文,附精度速度初探和对比总结
【YOLOv8 注意事项】 1. YOLOv8 的官方仓库和代码已上线,文档教程网址也刚刚更新。 2. YOLOv8 代码集成在 ultralytics 项目中,目前看不会再单独创建叫做 YOLOv8 的项目。 3. YOLOv8 即将有论文了!要知道 YOLOv5 自从 2020 年发布以来,一直是没有论文的。而 YOLOv8(YOLOv5团队)这次首次承认将先发布 arXiv 版本的论文(目前还在火速撰写中)。
2215 0
YOLOv8代码上线,官方宣布将发布论文,附精度速度初探和对比总结
|
存储 Java 应用服务中间件
Java规则引擎Drools急速入门
Java规则引擎Drools急速入门
Java规则引擎Drools急速入门
|
网络协议
Wireshark 捕获和显示过滤器
Wireshark 捕获和显示过滤器
347 0
|
存储 Kubernetes 安全
在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
|
JavaScript Ubuntu 关系型数据库
在Linux中,如何查询已安装软件包的版本信息?
在Linux中,如何查询已安装软件包的版本信息?
|
机器学习/深度学习 人工智能 算法
使用纹理对比度检测检测AI生成的图像
在本篇文章中我们将介绍如何开发一个深度学习模型来检测人工智能生成的图像
222 0
|
Java API
【亮剑】三种有效的方法来删除List中的重复元素Java的List
【4月更文挑战第30天】本文介绍了三种Java中删除List重复元素的方法:1) 使用HashSet,借助其不允许重复值的特性;2) 利用Java 8 Stream API的distinct()方法;3) 对自定义对象重写equals()和hashCode()。每种方法都附带了代码示例,帮助理解和应用。
1177 1