最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺析drools中Fact的equality?modes

 更新時間:2022年05月17日 09:36:44   作者:huan1993  
這篇文章主要介紹了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中插入一個新的對象,只有這個對象不存在(根據(jù)對象的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屬性來配置。

其余的配置方法,參考下圖:

四、編碼實現(xiàn)

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、編寫一個規(guī)則文件

package rules
import com.huan.drools.Person
// 定義規(guī)則
rule "rule_01"
    when
        $p: Person()
    then
        System.out.println(Thread.currentThread().getName() + " name:"+$p.getName()+" age:"+$p.getAge());
end

規(guī)則文件中的內容很簡單,只要工作內存中存在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方法進行重寫了,根據(jù)構造方法的前2個參數(shù)。

1、identity模式下

factHandle1 != factHandle2 因為p1和p2是2個不同的對象。
factHandle2 == factHandle3 因為是p2重復加入工作內存,這個時候工作內存中已經存在了,所以返回之前關聯(lián)的FactHandle

2、equality模式下

factHandle1 == factHandle2 == factHandle3 因為這種模式下,是需要根據(jù)對象的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內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談Java中Spring Boot的優(yōu)勢

    淺談Java中Spring Boot的優(yōu)勢

    在本篇文章中小編給大家分析了Java中Spring Boot的優(yōu)勢以及相關知識點內容,興趣的朋友們可以學習參考下。
    2018-09-09
  • java實現(xiàn)時間控制的幾種方案

    java實現(xiàn)時間控制的幾種方案

    這篇文章主要介紹了java實現(xiàn)時間控制的幾種方案,本文從多個方面給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • jackson 實現(xiàn)null轉0 以及0轉null的示例代碼

    jackson 實現(xiàn)null轉0 以及0轉null的示例代碼

    這篇文章主要介紹了jackson 實現(xiàn)null轉0 以及0轉null的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java8快速實現(xiàn)List轉map 、分組、過濾等操作

    java8快速實現(xiàn)List轉map 、分組、過濾等操作

    這篇文章主要介紹了java8快速實現(xiàn)List轉map 、分組、過濾等操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Java異常處理機制throws舉例詳解

    Java異常處理機制throws舉例詳解

    這篇文章主要介紹了Java中異常處理機制,包括finally的使用、異步處理的方式(throws)、以及手動拋出異常,finally用于確保資源釋放,throws用于聲明方法可能拋出的異常,由調用者處理,手動拋出異常則是在特定條件下主動拋出異常對象,需要的朋友可以參考下
    2024-11-11
  • java基礎之Collection與Collections和Array與Arrays的區(qū)別

    java基礎之Collection與Collections和Array與Arrays的區(qū)別

    這篇文章主要介紹了java基礎之Collection與Collections和Array與Arrays的區(qū)別的相關資料,本文主要說明兩者的區(qū)別以防大家混淆概念,需要的朋友可以參考下
    2017-08-08
  • mybatis查詢oracle long類型的踩坑記錄

    mybatis查詢oracle long類型的踩坑記錄

    這篇文章主要介紹了mybatis查詢oracle long類型的踩坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java面試題沖刺第二十三天--分布式

    Java面試題沖刺第二十三天--分布式

    這篇文章主要為大家分享了最有價值的三道關于分布式的面試題,涵蓋內容全面,包括數(shù)據(jù)結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java中Stream實現(xiàn)List排序的六個核心技巧總結

    Java中Stream實現(xiàn)List排序的六個核心技巧總結

    這篇文章主要介紹了Java中Stream實現(xiàn)List排序的六個核心技巧,分別是自然序排序、反向排序、空值安全處理、多字段組合排序、并行流加速、原地排序等,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • 基于Java多線程notify與notifyall的區(qū)別分析

    基于Java多線程notify與notifyall的區(qū)別分析

    本篇文章對Java中多線程notify與notifyall的區(qū)別進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05

最新評論

乡宁县| 镇巴县| 德化县| 廊坊市| 德钦县| 井研县| 常山县| 阿图什市| 肥城市| 榆社县| 盐源县| 延津县| 武定县| 阿拉善左旗| 微博| 凯里市| 瓦房店市| 揭西县| 德惠市| 府谷县| 宁南县| 礼泉县| 道真| 顺平县| 南宫市| 嘉定区| 文昌市| 资中县| 南丰县| 武陟县| 卫辉市| 滨海县| 临西县| 平远县| 左云县| 锡林郭勒盟| 双流县| 鱼台县| 大余县| 互助| 武安市|