《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 条评论
登录 后参与评论

相关文章

来自专栏LuckQI

Java核心技术讲解学习

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

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

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

8.6K12
来自专栏Python小屋

Python代码优化之in关键字

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

2728
来自专栏程序员互动联盟

抓包工具Wireshark过滤规则实践第一篇

引子 现在从网上看到的一些wireshark过滤规则的介绍,都是比较老一点的,新版本的语法好像有所变化,所以在这里写一篇基于最新的1.12版本的wireshar...

4299
来自专栏大数据和云计算技术

MongoDB系列8:MongoDB集合的增量更新

在关系型数据库中,经常会遇到这样的场景:用某张表或是多张表的关联产生的结果集,然后持续地更新另外一张表的数据,有时为了方便,只更新变化的数据,即增量更新。那么在...

1723
来自专栏程序员的知识天地

这4个Python实战项目,让你瞬间读懂Python!

Python当下真的很火。Python实战项目,也一直尤为关注,接下来,和大家介绍下十个Python练手的实战项目

993
来自专栏IT可乐

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

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

24510
来自专栏知识分享

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

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

3444
来自专栏张善友的专栏

我为何需要使用空接口?

FxCop设计规则中的第三条提供了对空接口的检查.下面是它的描述: 一个接口提供了一组行为和使用契约(usage contract),任何一个类型都可以实现这个...

1935
来自专栏JAVA烂猪皮

BAT面试常的问题和最佳答案

客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将reques...

972

扫码关注云+社区