您好,登錄后才能下訂單哦!
這篇文章主要介紹了drools的有狀態Session和無狀態Session是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇drools的有狀態Session和無狀態Session是什么文章都會有所收獲,下面我們一起來看看吧。
在drools
中存在2種session,一種是有狀態的Session (Stateful Session
),另外一種一種是無狀態的Session (Stateless Session
)。
1、那么他們2者之間有什么不同呢?
2、何時該使用有狀態的Session,何時該使用無狀態的Session?此處簡單說一下我的理解
。
有狀態 session 是使用推理對fact 對象隨時間進行迭代更改的會話。 在有狀態的 session中,來自 session的先前調用(先前的會話狀態)的數據在會話調用之間保留,而在無狀態的 session中,該數據被丟棄。
無狀態 session 是不會使用推理對fact 對象隨時間進行迭代更改的會話。 無狀態 Session 的先前調用的數據在會話之間不會保留的。
解釋:
針對無狀態 session 是不會使用推理對fact 對象隨時間進行迭代更改的會話
的理解,我的理解是 針對Java Api
來使用的,
1、在無狀態的Session中,只有execute
方法,多次調用execute
方法,在上次execute
方法不會影響下次execute
方法的執行。
2、而在drl
文件中使用insert
或update
或modify
或delete
等方法時,會導致工作內存的對象更新,導致規則的重新匹配。
1、如果說我們只是驗證一下規則,那么用無狀態的Session。
比如:
驗證用戶是否有開銀行卡的條件。計算訂單金額的折扣。
即一步就可以完成。
2、如果說我們的規則需要多步來完成,則可以用有狀態的Session。
比如:
向Session中插入Fact對象A,然后觸發規則。執行一段Java代碼向Session中插入Fact對象B,然后觸發規則,此時的規則需要依賴上一步規則的數據。
即需要關聯的多步來完成。
我們自己有一個Count
對象,該對象存在cnt
和name
2個屬性。
規則文件中存在如下2個規則
規則一:
如果工作內存中存在Count
對象,則將Count
對象的cnt
屬性加1
規則二:
如果工作內存中存在2
個Count
對象,一個對象的name=count-01
另一個對象的name=count-02
則輸出ok
字符串。
針對有狀態Session和無狀態Session,看結果有什么不同。
<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>
@Data @AllArgsConstructor public class Counter { /** * 名稱 */ private String name; /** * 計數 */ private Integer cnt; }
就是一個普通的java對象。
<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>
此處需要注意ksession
中type
的值,無狀態Session和有狀態Session的值不一致,不寫type,默認就是有狀態Session。
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
1、因為是有狀態的Session,在多次fireAllRules
的時候,上次插入到工作內存的對象還是存在的。即Session的數據保留了
。
2、有狀態Session在執行完之后,必須要調用dispose
方法,避免內存泄漏。
無狀態的Session,因為會丟失Session的數據,所以ok
沒有輸出出來。
1、在drl
文件中,使用insert\update\modify\delete
等方法時,都在導致規則的重新匹配。
2、Java
代碼中是否可以獲取stateful session
或stateless session
是有ksession
中的type
的值決定的。
3、stateless session
在execute
執行完之后,會清除工作內存中的數據,而stateful session
在fireAllRules
則不會清除,除非調用了dispose
方法。
4、個人理解有狀態和無狀態從api層面更好理解。
關于“drools的有狀態Session和無狀態Session是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“drools的有狀態Session和無狀態Session是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。