亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

drools的有狀態Session和無狀態Session是什么

發布時間:2022-05-17 11:07:53 來源:億速云 閱讀:201 作者:zzz 欄目:開發技術

這篇文章主要介紹了drools的有狀態Session和無狀態Session是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇drools的有狀態Session和無狀態Session是什么文章都會有所收獲,下面我們一起來看看吧。

    一、理解

    drools中存在2種session,一種是有狀態的Session (Stateful Session),另外一種一種是無狀態的Session (Stateless Session)。

    1、那么他們2者之間有什么不同呢?
    2、何時該使用有狀態的Session,何時該使用無狀態的Session?
    此處簡單說一下我的理解

    1、有狀態Session

    有狀態 session 是使用推理對fact 對象隨時間進行迭代更改的會話。 在有狀態的 session中,來自 session的先前調用(先前的會話狀態)的數據在會話調用之間保留,而在無狀態的 session中,該數據被丟棄。

    2、無狀態Session

    無狀態 session 是不會使用推理對fact 對象隨時間進行迭代更改的會話。 無狀態 Session 的先前調用的數據在會話之間不會保留的。

    解釋:
    針對無狀態 session 是不會使用推理對fact 對象隨時間進行迭代更改的會話的理解,我的理解是 針對Java Api來使用的,
    1、在無狀態的Session中,只有execute方法,多次調用execute方法,在上次execute方法不會影響下次execute方法的執行。
    2、而在drl文件中使用insertupdatemodifydelete等方法時,會導致工作內存的對象更新,導致規則的重新匹配。

    3、那么何時使用不同的Session呢?

    1、如果說我們只是驗證一下規則,那么用無狀態的Session。
    比如:

    驗證用戶是否有開銀行卡的條件。計算訂單金額的折扣。

    即一步就可以完成。

    2、如果說我們的規則需要多步來完成,則可以用有狀態的Session。
    比如:

    向Session中插入Fact對象A,然后觸發規則。執行一段Java代碼向Session中插入Fact對象B,然后觸發規則,此時的規則需要依賴上一步規則的數據。

    即需要關聯的多步來完成。

    二、需求

    我們自己有一個Count對象,該對象存在cntname2個屬性。
    規則文件中存在如下2個規則

    規則一:
    如果工作內存中存在Count對象,則將Count對象的cnt屬性加1
    規則二:
    如果工作內存中存在2Count對象,一個對象的name=count-01另一個對象的name=count-02則輸出ok字符串。

    針對有狀態Session和無狀態Session,看結果有什么不同。

    三、實現步驟

    1、項目結構說明

    drools的有狀態Session和無狀態Session是什么

    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>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
    </dependencies>

    3、編寫Count類

    @Data
    @AllArgsConstructor
    public class Counter {
        /**
         * 名稱
         */
        private String name;
        /**
         * 計數
         */
        private Integer cnt;
    }

    就是一個普通的java對象。

    4、編寫kmodule.xml文件

    <kmodule xmlns="http://www.drools.org/xsd/kmodule">
        <kbase name="kabse-01" packages="rules.stateful" default="false">
            <!--
                type="stateful" 表示有狀態的session
            -->
            <ksession name="stateful-session" default="false" type="stateful"/>
        </kbase>
        <kbase name="kabse-02" packages="rules.stateless" default="false">
            <!--
                type="stateless" 表示無狀態的session
            -->
            <ksession name="stateless-session" default="false" type="stateless"/>
        </kbase>
    </kmodule>

    此處需要注意ksessiontype的值,無狀態Session和有狀態Session的值不一致,不寫type,默認就是有狀態Session。

    5、編寫規則文件

    package rules.stateful
    import com.huan.drools.Counter
    // 將counter中的cnt的值遞增一下
    rule "stateful_rule_count_increment"
        when
            $counter: Counter( )
        then
            $counter.setCnt($counter.getCnt() + 1);
            System.out.println("rule_count_increment: count name:[" + $counter.getName()+"],cnt=[" + $counter.getCnt() + "]");
    end
    // 如果工作內存中同時存在 count-01 和 counter-02 則輸出ok
    rule "stateful_rule_count_exists"
        when
            Counter(name == "count-01") and Counter(name == "count-02")
        then
            System.out.println("ok");
    end

    6、Stateful session運行結果

    drools的有狀態Session和無狀態Session是什么

    1、因為是有狀態的Session,在多次fireAllRules的時候,上次插入到工作內存的對象還是存在的。即Session的數據保留了
    2、有狀態Session在執行完之后,必須要調用dispose方法,避免內存泄漏。

    7、Stateless Session運行結果

    drools的有狀態Session和無狀態Session是什么

    無狀態的Session,因為會丟失Session的數據,所以ok沒有輸出出來。

    四、注意事項

    1、在drl文件中,使用insert\update\modify\delete等方法時,都在導致規則的重新匹配。
    2、Java代碼中是否可以獲取stateful sessionstateless session是有ksession中的type的值決定的。
    3、stateless sessionexecute執行完之后,會清除工作內存中的數據,而stateful sessionfireAllRules則不會清除,除非調用了dispose方法。
    4、個人理解有狀態和無狀態從api層面更好理解。

    關于“drools的有狀態Session和無狀態Session是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“drools的有狀態Session和無狀態Session是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    东兰县| 泉州市| 青岛市| 合川市| 恩平市| 台安县| 湖南省| 旺苍县| 山东| 隆尧县| 米脂县| 光山县| 丹棱县| 仁寿县| 宜君县| 牟定县| 策勒县| 石屏县| 宜昌市| 吉林省| 米泉市| 万源市| 繁昌县| 土默特左旗| 唐海县| 鲁甸县| 来安县| 阳原县| 潮州市| 交城县| 重庆市| 浮梁县| 镇远县| 盐山县| 固镇县| 仪陇县| 静宁县| 文水县| 新晃| 满城县| 额尔古纳市|