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

聊聊drools?session的不同

 更新時間:2022年05月17日 09:47:04   作者:huan1993  
在drools中存在2種session,一種是有狀態(tài)的Session (Stateful Session),另外一種一種是無狀態(tài)的Session (Stateless Session,本文通過實例代碼給大家介紹drools?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的先前調用(先前的會話狀態(tài))的數據在會話調用之間保留,而在無狀態(tài)的 session中,該數據被丟棄。

2、無狀態(tài)Session

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

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

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

二、需求

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

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

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

三、實現步驟

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>
    <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" 表示有狀態(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
// 如果工作內存中同時存在 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運行結果

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

7、Stateless Session運行結果

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

四、注意事項

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

五、完整代碼

https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-session

六、參考文檔

1、https://docs.drools.org/7.69.0.Final/drools-docs/html_single/index.html#kie-sessions-con_decision-engine
2、https://www.javainuse.com/drools_states
3、https://groups.google.com/g/drools-usage/c/qYbqiS1ht4g

到此這篇關于drools session理解的文章就介紹到這了,更多相關drools session內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java類加載器和類反射使用示例

    java類加載器和類反射使用示例

    這篇文章主要介紹了java類加載器和類反射使用示例,需要的朋友可以參考下
    2014-03-03
  • java 迭代器模式實例詳解

    java 迭代器模式實例詳解

    這篇文章主要介紹了java 迭代器模式實例詳解的相關資料,需要的朋友可以參考下
    2017-05-05
  • Java基礎:流Stream詳解

    Java基礎:流Stream詳解

    Stream流是數據渠道,用于操作數據源(集合、數組等)所生成的元素序列。這篇文章主要介紹了Java8新特性Stream流的相關資料,需要的朋友參考下吧
    2021-09-09
  • Java8新特性之lambda(動力節(jié)點Java學院整理)

    Java8新特性之lambda(動力節(jié)點Java學院整理)

    這篇文章主要介紹了Java8新特性之lambda(動力節(jié)點Java學院整理)表達式的相關知識,包括lambda語法方面的知識,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-06-06
  • hdfs集成springboot使用方法

    hdfs集成springboot使用方法

    這篇文章主要介紹了hdfs集成springboot使用,配置Configuration信息分為兩種方式,每種方式給大家介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • Java利用蒙特卡洛方法求解圓周率π值

    Java利用蒙特卡洛方法求解圓周率π值

    蒙特·卡羅方法(Monte Carlo method),也稱統(tǒng)計模擬方法,是一種以概率統(tǒng)計理論為基礎的數值計算方法。本文將利用該方法實現圓周率的計算,需要的可以參考一下
    2022-08-08
  • Java反射機制及Method.invoke詳解

    Java反射機制及Method.invoke詳解

    這篇文章主要介紹了Java反射機制及Method.invoke詳解,本文講解了JAVA反射機制、得到某個對象的屬性、得到某個類的靜態(tài)屬性、執(zhí)行某對象的方法、執(zhí)行某個類的靜態(tài)方法等內容,需要的朋友可以參考下
    2015-03-03
  • 詳解Maven項目缺少Maven Dependencies解決方法總結

    詳解Maven項目缺少Maven Dependencies解決方法總結

    這篇文章主要介紹了詳解Maven項目缺少Maven Dependencies解決方法總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • JAVA泛型的繼承和實現、擦除原理解析

    JAVA泛型的繼承和實現、擦除原理解析

    這篇文章主要介紹了JAVA泛型的繼承和實現、擦除原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 通過Spring Boot配置動態(tài)數據源訪問多個數據庫的實現代碼

    通過Spring Boot配置動態(tài)數據源訪問多個數據庫的實現代碼

    這篇文章主要介紹了通過Spring Boot配置動態(tài)數據源訪問多個數據庫的實現代碼,需要的朋友可以參考下
    2018-03-03

最新評論

和顺县| 汽车| 会同县| 方正县| 新沂市| 焦作市| 城步| 夏邑县| 大英县| 巴中市| 德州市| 涡阳县| 东乌| 望都县| 宜君县| 江油市| 金门县| 龙胜| 南靖县| 渝北区| 太康县| 柳河县| 金寨县| 无极县| 佛山市| 三台县| 二连浩特市| 谢通门县| 资阳市| 灵石县| 邻水| 柳林县| 平谷区| 安塞县| 宝丰县| 吉安县| 十堰市| 进贤县| 永城市| 台中市| 枞阳县|