drools中Fact的equality模式

  • 一、equality modes介绍
    • 1、identity模式
    • 2、equality模式
  • 二、需求
  • 三、如何设置fact对象的equality行为
  • 四、编码实现
    • 1、项目结构图
    • 2、倒入jar包
    • 3、编写Person对象
    • 4、编写kmodule.xml文件
    • 5、编写一个规则文件
    • 6、identity模式测试
      • 1、编写测试代码
      • 2、运行结果
    • 7、equality模式测试
      • 1、编写测试代码
      • 2、运行结果
  • 五、结论
    • 1、identity模式下
    • 2、equality模式下
    • 六、完整代码
    • 七、参考链接

一、equality modes介绍

drools中存在如下2种equality modes。

1、identity模式

identity:这是默认的情况。drools引擎使用IdentityHashMap保存所有插入到工作内存中的Fact对象。对于每次插入一个新的对象,则会返回一个新的FactHandle对象。如果是重复插入对象,则返回已经存在的FactHandle对象。

举例:

Person p1 = new Person("zhangsan", 20, "湖北罗田");
Person p2 = new Person("zhangsan", 20, "湖北黄冈罗田");FactHandle factHandle1 = kieSession.insert(p1);
FactHandle factHandle2 = kieSession.insert(p2);
FactHandle factHandle3 = kieSession.insert(p2);

针对以上例子, factHandle1 != factHandle2但是 factHandle2 == factHandle3。即工作内存中会存在2个Person对象。

2、equality模式

equality:drools引擎使用HashMap保存所有插入到工作内存中的Fact对象。在这种模式下,如果向drools中插入一个新的对象,只有这个对象不存在(根据对象的hashcodeequals判断)才会返回一个新的FactHandle否则返回已经存在的FactHandle

举例:

// 重写了Person对象的hashcode和equals方法
Person p1 = new Person("zhangsan", 20, "湖北罗田");
Person p2 = new Person("zhangsan", 20, "湖北黄冈罗田");FactHandle factHandle1 = kieSession.insert(p1);
FactHandle factHandle2 = kieSession.insert(p2);
FactHandle factHandle3 = kieSession.insert(p2);

针对以上例子, factHandle1 == factHandle2但是 factHandle2 == factHandle3。即工作内存中会存在1个Person对象。

二、需求

我们存在一个Person对象,存在如下3个属性name,age和address,其中重写对象的name和age的hashcode和equals方法。

  1. 多次向工作内存中插入对象,看产生的结果。
  2. 插入同一个对象看获取到的FactHandle对象是否是同一个。

三、如何设置fact对象的equality行为

此处介绍一个通过kmodule.xml配置的方法

<kmodule xmlns="http://www.drools.org/xsd/kmodule"><kbase name="kbase-identity" packages="rules" default="false" equalsBehavior="identity"><ksession name="ksession-01" default="false" type="stateful"/></kbase><kbase name="kbase-equality" packages="rules" default="false" equalsBehavior="equality"><ksession name="ksession-02" default="false" type="stateful"/></kbase>
</kmodule>

通过上方的代码可知是通过配置kbase下的equalsBehavior属性来配置。

其余的配置方法,参考下图:

四、编码实现

1、项目结构图

2、倒入jar包

<dependencyManagement><dependencies><dependency><groupId>org.drools</groupId><artifactId>drools-bom</artifactId><type>pom</type><version>7.69.0.Final</version><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-mvel</artifactId></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version></dependency>
</dependencies>

3、编写Person对象

public class Person {private String name;private Integer age;private String address;public Person(String name, Integer age, String address) {this.name = name;this.age = age;this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return Objects.equals(name, person.name) && Objects.equals(age, person.age);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}

注意:
此对象需要重写hashcode和equals方法。

4、编写kmodule.xml文件

在此配置文件中,需要在kbase上指定equalsBehavior,用来确定Fact对象的equality modes。

<kmodule xmlns="http://www.drools.org/xsd/kmodule"><kbase name="kbase-identity" packages="rules" default="false" equalsBehavior="identity"><ksession name="ksession-01" default="false" type="stateful"/></kbase><kbase name="kbase-equality" packages="rules" default="false" equalsBehavior="equality"><ksession name="ksession-02" default="false" type="stateful"/></kbase>
</kmodule>

注意:
需要看2个equalsBehavior的取值

5、编写一个规则文件

package rulesimport com.huan.drools.Person// 定义规则
rule "rule_01"when$p: Person()thenSystem.out.println(Thread.currentThread().getName() + " name:"+$p.getName()+" age:"+$p.getAge());
end

规则文件中的内容很简单,只要工作内存中存在Person对象,那么就输出这个对象的nameage的值。

6、identity模式测试

1、编写测试代码

public class DroolsApplication {public static void main(String[] args) {equalsBehaviorIdentity();}private static void equalsBehaviorIdentity() {KieServices kieServices = KieServices.get();KieContainer kieContainer = kieServices.getKieClasspathContainer();// 注意此处的 ksession-01KieSession kieSession = kieContainer.newKieSession("ksession-01");kieSession.addEventListener(new DebugRuleRuntimeEventListener());Person p1 = new Person("zhangsan", 20, "湖北罗田");Person p2 = new Person("zhangsan", 20, "湖北黄冈罗田");FactHandle factHandle1 = kieSession.insert(p1);FactHandle factHandle2 = kieSession.insert(p2);FactHandle factHandle3 = kieSession.insert(p2);kieSession.fireAllRules();kieSession.dispose();}
}

2、运行结果


具体的解释见上图中的说明。

7、equality模式测试

1、编写测试代码

public class DroolsApplication {public static void main(String[] args) {equalsBehaviorEquality();}private static void equalsBehaviorEquality() {KieServices kieServices = KieServices.get();KieContainer kieContainer = kieServices.getKieClasspathContainer();KieSession kieSession = kieContainer.newKieSession("ksession-02");kieSession.addEventListener(new DebugRuleRuntimeEventListener());Person p1 = new Person("zhangsan", 20, "湖北罗田");Person p2 = new Person("zhangsan", 20, "湖北黄冈罗田");FactHandle factHandle1 = kieSession.insert(p1);FactHandle factHandle2 = kieSession.insert(p2);FactHandle factHandle3 = kieSession.insert(p2);kieSession.fireAllRules();kieSession.dispose();}
}

2、运行结果

五、结论

针对如下代码,看看在不同equality modes下的行为

 Person p1 = new Person("zhangsan", 20, "湖北罗田");Person p2 = new Person("zhangsan", 20, "湖北黄冈罗田");FactHandle factHandle1 = kieSession.insert(p1);FactHandle factHandle2 = kieSession.insert(p2);FactHandle factHandle3 = kieSession.insert(p2);

Person对象的hashcode和equals方法进行重写了,根据构造方法的前2个参数。

1、identity模式下

factHandle1 != factHandle2 因为p1和p2是2个不同的对象。
factHandle2 == factHandle3 因为是p2重复加入工作内存,这个时候工作内存中已经存在了,所以返回之前关联的FactHandle

2、equality模式下

factHandle1 == factHandle2 == factHandle3 因为这种模式下,是需要根据对象的equalshashcode方法进行比较,而Person对象重写了这2个方法,所以返回的是同一个。

六、完整代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-fact-equality-modes

七、参考链接

1、https://docs.drools.org/7.69.0.Final/drools-docs/html_single/index.html#fact-equality-modes-con_decision-engine

drools中Fact的equality modes相关推荐

  1. drools中一个复杂场景的dmn

    现在遇到一个问题,就是都知道规则引擎是个好东西,但怎么用它却没有一个直观的概念. 因为看到的example都是很简单的,简单的东西什么工具都能做,要体现优势就需要有个复杂场景,这个场景在dmn里可以可 ...

  2. drools中一个复杂场景的dmn (presentation)

    dmn文件下载: https://download.csdn.net/download/wangduqiang747/86504599

  3. springboot中使用规则引擎Drools

    文章目录 规则引擎的场景 规则引擎介绍 使用规则引擎的优势 规则引擎应用场景 rools介绍 Drools入门案例 规则引擎构成 Drools基础语法 springboot使用规则引擎 规则引擎的场景 ...

  4. drools规则引擎中易混淆语法分析_相互触发导致死循环分析

    整理了下最近在项目中使用drools出现的问题,幸好都在开发与测试阶段解决了,未波及到prod. 首先看这样两条规则: /*** 规则1_set默认利率a */ rule "rate_def ...

  5. drools规则引擎的在项目中的使用手记

    需求 按照登录用户的会员等级 和签到周期 根据一定的计算规则送积分.由于之前都是通过if else去做的控制.规则变更的时候可能需要重新调整代码甚至发布服务. 由于不想再每次规则变更后需要调整代码,于 ...

  6. 规则引擎Drools在贷后催收业务中的应用

    作者:vivo 互联网服务器团队- Feng Xiang 在日常业务开发工作中我们经常会遇到一些根据业务规则做决策的场景.为了让开发人员从大量的规则代码的开发维护中释放出来,把规则的维护和生成交由业务 ...

  7. 详解:Drools规则引擎探究

    引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...

  8. Drools 5.1.1(一)

    http://shikonglaike.iteye.com/blog/1236354 第一章欢迎 我总是和终端业务用户争论不休,理解规则和流程.最新规则和事件处理的区别.对此,在他们的意识中有这样的问 ...

  9. drools。drools_使用Drools和JPA进行连续的实时数据分析

    负责管理复杂工作流,业务规则和商业智能的企业开发人员可以Swift实现集成了工作流引擎,企业服务总线(ESB)和规则引擎的企业平台的价值. 到目前为止,这个最佳点已经被商业产品所填补,例如IBMWeb ...

  10. Drools从入门到精通之KIE

    KIE即Knowledge Is EveryThing的缩写 KIE包含以下不同但相关的项目,为业务自动化和管理提供完整的解决方案组合: Drools是一个业务规则管理系统,具有前向链接和后向链接推理 ...

最新文章

  1. java 文件路径表达式_Java基础(二十二) Lambda表达式和File类
  2. 广文艺计算机综合美术,广东文艺职业学院2018年第二批合同制人员招聘专业技能考核和试讲题目...
  3. OpenCV使用pthread实现多线程加速处理图像(C++)
  4. php 正则替换 ubb,php实现过滤UBB代码的类
  5. xml 属性value换行显示_跟光磊学Java开发-Java解析XML
  6. xampp apache无法启动的解决方法
  7. 敏捷个人A2组第一次讨论纪要 如何让别人乐于帮助你?
  8. jpeg 转bmp代码_代码写得很牛逼但UI界面却搞得很丑?来,杨工带你!
  9. DenseNet解析
  10. 项目实训12——解析建表的SQL语句
  11. redis——jedis的使用以及springboot整合redis
  12. [渝粤教育] 徐州工业职业技术学院 橡胶原材料 参考 资料
  13. SEOer必读:50个网站推广方法
  14. 安装Win11找不到固态硬盘如何解决?
  15. 关于硕士毕业直接工作还是继续读博的一些思考
  16. 2021qq匿名说说在哪里
  17. 【java】统计正数和负数的个数然后计算这些数的平均值
  18. 用C语言,职工信息管理系统
  19. 【金融量化】什么叫市价单、限价单和停止单?
  20. mysql 工具 uwp_UWP 创建动画的极简方式 — LottieUWP

热门文章

  1. 计算机上的无线网络开关怎么打开,无线网络开关怎么开启
  2. IT精英《非诚》引论战 泰国帅哥转角遇到爱
  3. (二)史玉柱:我的营销心得有感------主要关注网络游戏策划
  4. 1024程序员节日,祝愿所有的程序员节日快乐
  5. 以太坊为什么又要进行“缪尔冰川”硬分叉?
  6. Spring的AOP的基于AspectJ注解开发——Spring的JDBC的模板的使用——Spring的事务管理
  7. 【转】【Coursera公开课】Applying to U.S. Universities(如何申请美国大学)笔记
  8. 外贸独立站卖家如何借势营销?
  9. 【分享帖】国内主流网络信息采集和页面数据抓取工具盘点
  10. python获取手机号码归属地_基于Python的免费手机号码归属地查询