当前位置: 首页 > 后端技术 > Java

drools中Fact的相等模式

时间:2023-04-01 18:45:30 Java

1.相等模式介绍drools中有两种相等模式。1.身份模式身份:这是默认情况。drools引擎使用IdentityHashMap来保存所有插入到工作内存中的Fact对象。对于新对象的每次插入,都会返回一个新的FactHandle对象。如果重复插入该对象,则返回现有的FactHandle对象。例子:Personp1=newPerson("zhangsan",20,"湖北洛田");Personp2=newPerson("zhangsan",20,"湖北黄冈洛田");FactHandlefactHandle1=kieSession.insert(p1);FactHandlefactHandle2=kieSession.insert(p2);FactHandlefactHandle3=kieSession.insert(p2);对于上面的例子,factHandle1!=factHandle2但factHandle2==factHandle3。即工作内存中会有2个Person对象。2.相等模式相等:drools引擎使用HashMap来保存所有插入到工作内存中的Fact对象。在这种模式下,如果向drools中插入一个新的对象,只有当该对象不存在(根据对象的hashcode和equals判断)时才返回一个新的FactHandle,否则返回一个已存在的FactHandle。例://重写Person对象的hashcode和equals方法Personp1=newPerson("zhangsan",20,"湖北洛田");Personp2=newPerson("zhangsan",20,"湖北黄冈洛田"");FactHandlefactHandle1=kieSession.insert(p1);FactHandlefactHandle2=kieSession.insert(p2);FactHandlefactHandle3=kieSession.insert(p2);对于上面的例子,factHandle1==factHandle2但factHandle2==factHandle3。工作内存中会有一个Person对象2.需求我们有一个Person对象,有如下三个属性name,age,address,其中重写了对象name和age的hashcode和equals方法插入对象多次进入工作内存看结果,插入同一个对象,看得到的FactHandle对象是否相同。3.如何设置fact对象的相等行为这里有一个方法可以通过kmodule.xml来配置通过上面的代码,我们通过配置kbase下的equalsBehavior属性可以看出是Configure。其余配置方法参考下图:4.编码实现1.项目结构图2.导入jar包bompom7??.69.0.Finalimport<依赖项>org.droolsdrools-编译器org.droolsdrools-mvelch.qos.logbacklogback-classic1.2.113、编写Person对象publicclassPerson{privateStringname;私人整数年龄;私有字符串地址;publicPerson(Stringname,Integerage,Stringaddress){this.name=name;这个。年龄=年龄;this.address=地址;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicIntegergetAge(){返回年龄;}publicvoidsetAge(Integerage){this.age=age;}publicStringgetAddress(){返回地址;}publicvoidsetAddress(Stringaddress){this.address=address;}@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;如果(o==null||getClass()!=o.getClass())返回false;Personperson=(Person)o;返回Objects.equals(name,person.name)&&Objects.equals(age,person.age);}@超过乘坐publicinthashCode(){returnObjects.hash(name,age);}}注意:这个对象需要重写hashcode和equals方法4.编写kmodule.xml文件在这个配置文件中,需要指定kbase上的equalsBehavior,用于判断Fact对象的相等模式。注意:需要看2个equalsBehavior的取值5.写一个规则文件包rulesimportcom.huan。drools.Person//定义规则规则"rule_01"when$p:Person()thenSystem.out.println(Thread.currentThread().getName()+"name:"+$p.getName()+"age:"+$p.getAge());endrulefile里面的内容很简单,只要workingmemory中有一个Person对象,那么就会输出这个对象的name和age的值。六、身份模式测试1.编写测试代码publicclassDroolsApplication{publicstaticvoidmain(String[]args){equalsBehaviorIdentity();}privatestaticvoidequalsBehaviorIdentity(){KieServiceskieServices=KieServices.get();KieContainerkieContainer=kieServices.getKieClasspathContainer();//注意这里的ksession-01KieSessionkieSession=kieContainer.newKieSession("ksession-01");kieSession.addEventListener(newDebugRuleRuntimeEventListener());Personp1=newPerson("zhangsan",20,"湖北罗田");Personp2=newPerson("zhangsan",20,"湖北黄冈洛田");FactHandlefactHandle1=kieSession.insert(p1);FactHandlefactHandle2=kieSession.insert(p2);FactHandlefactHandle3=kieSession.insert(p2);kieSession.fireAllRules();kieSession.dispose();}}2。运行结果的具体解释见上图中的说明。七、平等模式测试1.编写测试代码publicclassDroolsApplication{publicstaticvoidmain(String[]args){equalsBehaviorEquality();}privatestaticvoidequalsBehaviorEquality(){KieServiceskieServices=KieServices.get();KieContainerkieContainer=kieServices.getKieClasspathContainer();KieSessionkieSession=kieContainer.newKieSession("ksession-02");kieSession.addEventListener(newDebugRuleRuntimeEventListener());Personp1=newPerson("zhangsan",20,"湖北罗田");Personp2=newPerson("zhangsan",20,"湖北黄冈洛田");FactHandlefactHandle1=kieSession.insert(p1);FactHandlefactHandle2=kieSession.insert(p2);FactHandlefactHandle3=kieSession.insert(p2);kieSession。fireAllRules();kieSession.dispose();}}2.运行结果5.结论下面的代码,看看不同平等模式下的表现Personp1=newPerson("zhangsan",20,"湖北洛天&quo吨;);Personp2=newPerson("zhangsan",20,"湖北黄冈洛田");FactHandlefactHandle1=kieSession.insert(p1);FactHandlefactHandle2=kieSession.insert(p2);FactHandlefactHandle3=kieSession.insert(p2);Person对象的hashcode和equals方法重写,根据构造方法1的前两个参数,恒等模式下的factHandle1!=factHandle2因为p1和p2是两个不同的对象。factHandle2==factHandle3因为p2被重复添加到工作内存中,此时它已经存在于工作内存中,所以返回之前关联的FactHandle2,而在相等模式下factHandle1==factHandle2==factHandle3因为在这种模式下,需要根据对象的equals与hashcode方法进行比较,而Person对象重写了这两个方法,所以返回的是同一个。六、完整代码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