pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

深入淺析drools中Fact的equality?modes

這篇文章主要介紹了drools中Fact的equality?modes的相關知識,本文通過圖文實例代碼相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、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方法。

  • 多次向工作內存中插入對象,看產生的結果。
  • 插入同一個對象看獲取到的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;
    }
    @Override
    public 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);
    }
    @Override
    public 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 rules
import com.huan.drools.Person
// 定義規則
rule "rule_01"
    when
        $p: Person()
    then
        System.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-01
        KieSession 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的文章就介紹到這了,更多相關drools equality modes內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

主站蜘蛛池模板: 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 萃取箱-萃取槽-PVC萃取箱厂家-混合澄清槽- 杭州南方化工设备 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 哔咔漫画网页版在线_下载入口访问指引 | 无缝钢管-聊城无缝钢管-小口径无缝钢管-大口径无缝钢管 - 聊城宽达钢管有限公司 | 丽陂特官网_手机信号屏蔽器_Wifi信号干扰器厂家_学校考场工厂会议室屏蔽仪 | 球形钽粉_球形钨粉_纳米粉末_难熔金属粉末-广东银纳官网 | FFU_空气初效|中效|高效过滤器_空调过滤网-广州梓净净化设备有限公司 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 上海logo设计| 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 苏州工作服定做-工作服定制-工作服厂家网站-尺品服饰科技(苏州)有限公司 | 缝纫客 | 炒货机-炒菜机-炒酱机-炒米机@霍氏机械 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 常州律师事务所_常州律所_常州律师-江苏乐天律师事务所 | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 深圳离婚律师咨询「在线免费」华荣深圳婚姻律师事务所专办离婚纠纷案件 | 汽车水泵_汽车水泵厂家-瑞安市骏迪汽车配件有限公司 | 钣金加工厂家-钣金加工-佛山钣金厂-月汇好 | 耐火浇注料-喷涂料-浇注料生产厂家_郑州市元领耐火材料有限公司 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 桐城新闻网—桐城市融媒体中心主办 | 换网器_自动换网器_液压换网器--郑州海科熔体泵有限公司 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 废水处理-废气处理-工业废水处理-工业废气处理工程-深圳丰绿环保废气处理公司 | 金现代信息产业股份有限公司--数字化解决方案供应商 | 土壤养分检测仪_肥料养分检测仪_土壤水分检测仪-山东莱恩德仪器 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 电位器_轻触开关_USB连接器_广东精密龙电子科技有限公司 | 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 |