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

问题场景

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

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

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

问题原因

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

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

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

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

解决方案

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

后语

你的支持才是产出优质产品的最大动力,目前国内第一套关于Drools 7 的入门视频教程《Drools 7 规则引擎入门教程》即将完成录制。 打造国内一流Drools 技术交流群,提供免费翻译文档,技术咨询等。QQ群:593177274,欢迎大家加入讨论。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏炉边夜话

写程序应该注意的地方

1. 对于文本编辑框,一定要判断是否含有非法字符。对于数字型一定要判断是否含有非数字。对于字符型,一定要判断是否在允许的字符内。

19830
来自专栏java一日一条

Java 理论与实践: 正确使用 Volatile 变量

Java 语言中的 Volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变...

8320
来自专栏Python小屋

Python代码优化之in关键字

如果经常需要测试一个序列中是否包含某个元素,最好使用字典或集合,尽量不使用列表。 import random import time x_list = list...

28380
来自专栏玄魂工作室

Python爬虫之urllib模块2

--------------------------------------------------------------------------------...

29750
来自专栏程序员叨叨叨

听说你们家的NotifyDataSetChanged不起作用了

前几天,公司项目准备上线,就在前一晚,出现了一个BUG:主页界面刷新无效。千钧一发之际,用了一个笨方法,每次刷新的时候重新setAdapter一下算是实现了基本...

11020
来自专栏IT可乐

深入理解计算机系统(4.1)------Y86指令集体系结构

  本章我们将进入处理器体系结构介绍的神秘海洋中,我们熟悉的手机,电脑等设备的核心硬件都离不开处理器。处理器可以称的上是人类创造的最复杂的系统之一,一块手指大小...

277100
来自专栏专知

【分享】Java 9正式发布,9个新特性解读

转自:开源中国, www.oschina.net/translate/java-9-new-features Java 8 发布三年多之后,即将快到2017年7...

34950
来自专栏恰童鞋骚年

.NET单元测试的艺术-3.测试代码

开篇:上一篇我们学习单元测试和核心技术:存根、模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础。本篇会集中在管理和组织单元测试的技术,以及如何确保在真...

9230
来自专栏小程序·云开发专栏

小程序·云开发的云函数路由高级玩法

在掘金开发者大会上,在推荐实践那里,我有提到一种云函数的用法,我们可以将相同的一些操作。

9K130
来自专栏知识分享

51单片机开发板(W25Q16学习)

---恢复内容开始--- 今天测试开发板的W25Q16(16Mbit--Flash)写一篇文章备忘一下 先说一下容量的单位 计算机存储单位一般用B,KB、MB、...

35740

扫码关注云+社区

领取腾讯云代金券