溫馨提示×

溫馨提示×

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

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

drools的有狀態(tài)Session和無狀態(tài)Session是什么

發(fā)布時間:2022-05-17 11:07:53 來源:億速云 閱讀:191 作者:zzz 欄目:開發(fā)技術(shù)

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

    一、理解

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

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

    1、有狀態(tài)Session

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

    2、無狀態(tài)Session

    無狀態(tài) session 是不會使用推理對fact 對象隨時間進行迭代更改的會話。 無狀態(tài) Session 的先前調(diào)用的數(shù)據(jù)在會話之間不會保留的。

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

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

    1、如果說我們只是驗證一下規(guī)則,那么用無狀態(tài)的Session。
    比如:

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

    即一步就可以完成。

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

    向Session中插入Fact對象A,然后觸發(fā)規(guī)則。執(zhí)行一段Java代碼向Session中插入Fact對象B,然后觸發(fā)規(guī)則,此時的規(guī)則需要依賴上一步規(guī)則的數(shù)據(jù)。

    即需要關(guān)聯(lián)的多步來完成。

    二、需求

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

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

    針對有狀態(tài)Session和無狀態(tài)Session,看結(jié)果有什么不同。

    三、實現(xiàn)步驟

    1、項目結(jié)構(gòu)說明

    drools的有狀態(tài)Session和無狀態(tài)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;
        /**
         * 計數(shù)
         */
        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" 表示有狀態(tài)的session
            -->
            <ksession name="stateful-session" default="false" type="stateful"/>
        </kbase>
        <kbase name="kabse-02" packages="rules.stateless" default="false">
            <!--
                type="stateless" 表示無狀態(tài)的session
            -->
            <ksession name="stateless-session" default="false" type="stateless"/>
        </kbase>
    </kmodule>

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

    5、編寫規(guī)則文件

    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
    // 如果工作內(nèi)存中同時存在 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運行結(jié)果

    drools的有狀態(tài)Session和無狀態(tài)Session是什么

    1、因為是有狀態(tài)的Session,在多次fireAllRules的時候,上次插入到工作內(nèi)存的對象還是存在的。即Session的數(shù)據(jù)保留了
    2、有狀態(tài)Session在執(zhí)行完之后,必須要調(diào)用dispose方法,避免內(nèi)存泄漏。

    7、Stateless Session運行結(jié)果

    drools的有狀態(tài)Session和無狀態(tài)Session是什么

    無狀態(tài)的Session,因為會丟失Session的數(shù)據(jù),所以ok沒有輸出出來。

    四、注意事項

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

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

    向AI問一下細節(jié)

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

    AI