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))的數(shù)據(jù)在會話調用之間保留,而在無狀態(tài)的 session中,該數(shù)據(jù)被丟棄。
2、無狀態(tài)Session無狀態(tài) session 是不會使用推理對fact 對象隨時間進行迭代更改的會話。 無狀態(tài) Session 的先前調用的數(shù)據(jù)在會話之間不會保留的。
解釋: 針對無狀態(tài) session 是不會使用推理對fact 對象隨時間進行迭代更改的會話的理解,我的理解是 針對Java Api來使用的, 1、在無狀態(tài)的Session中,只有execute方法,多次調用execute方法,在上次execute方法不會影響下次execute方法的執(zhí)行。 2、而在drl文件中使用insert或update或modify或delete等方法時,會導致工作內存的對象更新,導致規(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ù)。
即需要關聯(lián)的多步來完成。
二、需求我們自己有一個Count對象,該對象存在cnt和name2個屬性。 規(guī)則文件中存在如下2個規(guī)則
規(guī)則一: ??????如果工作內存中存在Count對象,則將Count對象的cnt屬性加1 規(guī)則二: ??????如果工作內存中存在2個Count對象,一個對象的name=count-01另一個對象的name=count-02則輸出ok字符串。
針對有狀態(tài)Session和無狀態(tài)Session,看結果有什么不同。
三、實現(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><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency></dependencies>3、編寫Count類@Data@AllArgsConstructorpublic 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>此處需要注意ksession中type的值,無狀態(tài)Session和有狀態(tài)Session的值不一致,不寫type,默認就是有狀態(tài)Session。
5、編寫規(guī)則文件package rules.statefulimport 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 則輸出okrule "stateful_rule_count_exists"whenCounter(name == "count-01") and Counter(name == "count-02")thenSystem.out.println("ok");end6、Stateful session運行結果1、因為是有狀態(tài)的Session,在多次fireAllRules的時候,上次插入到工作內存的對象還是存在的。即Session的數(shù)據(jù)保留了。 2、有狀態(tài)Session在執(zhí)行完之后,必須要調用dispose方法,避免內存泄漏。
7、Stateless Session運行結果無狀態(tài)的Session,因為會丟失Session的數(shù)據(jù),所以ok沒有輸出出來。
四、注意事項1、在drl文件中,使用insert\update\modify\delete等方法時,都在導致規(guī)則的重新匹配。 2、Java代碼中是否可以獲取stateful session或stateless session是有ksession中的type的值決定的。 3、stateless session在execute執(zhí)行完之后,會清除工作內存中的數(shù)據(jù),而stateful session在fireAllRules則不會清除,除非調用了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 ?
原文:https://juejin.cn/post/7097140449168588807相關評說:
居巢區(qū)壓力: ______ 兩個都可以用來存私密的東西,同樣也都有有效期的說法. 區(qū)別在于. session是放在服務器上的,過期與否取決于服務期的設定,cookie是存在客戶端的,過去與否可以在cookie生成的...
居巢區(qū)壓力: ______ PHP頁面間參數(shù)傳遞的四種方法詳解:1. 使用客戶端瀏覽器的cookie cookie很容易理解,就是一個臨時文件,可以把它看成一個儲藏室,瀏覽器在瀏覽的過程中記錄一些信息,就暫時存放在這里.2. 使用服務器端的session 理解session是一件很容易的事情.與cookie的不同在于它是服務器端的臨時儲藏室.session常被稱作會話.3. 使用表單來傳遞 表單內的屬性action直接指定此表單內容傳遞到哪個頁面.method指明了傳遞的方式.post代表使用消息傳遞,就像我們發(fā)短信一樣.4. 使用超鏈接傳遞參數(shù) 我們上網(wǎng)的很多操作都是點擊超鏈接在網(wǎng)頁之間跳來跳去.點的同時同樣可以傳遞參數(shù).
居巢區(qū)壓力: ______ oracle數(shù)據(jù)庫的字符集有很多的,具體的也不能一一詳細地列舉出來了,但是,建庫的時候,會有選擇字符集的界面,點開下拉條,將會列出oracle所支持的所有字符集(10/12). 超集與子集是包含和被包含的關系,超集兼容子集.
居巢區(qū)壓力: ______ 1、對象不同.Application用于保存所有用戶的公共數(shù)據(jù)信息,Session用于保存每個用戶的專用信息; 2、信息量大小不同.Application適用于任何大小的數(shù)據(jù),Session只適用于少量、簡單的數(shù)據(jù); 3、保存時間不同.Application保存期貫穿...
居巢區(qū)壓力: ______ cookie和session的區(qū)別如下:1、session保存在服務器,客戶端不知道其中的信息;cookie保存在客戶端,服務器能夠知道其中的信息.2、session中保存的是對象,cookie中保存的是字符串.3、session不能區(qū)分路徑,同一個用戶在訪問一...
居巢區(qū)壓力: ______ 1.session對象: 指的是客戶端與服務器的一次會話,從客戶連到服務器的一個WebApplication開始,直到客戶端與服務器斷開連接為止.它是HttpSession類的實例. 2.application對象: 實現(xiàn)了用戶間數(shù)據(jù)的共享,可存放全局變量.它開始于服...
居巢區(qū)壓力: ______ session 是指一次的會話時間,也可以設置其生命周期session.setMaxInactiveInterval(10);這個語句設置了session的生存周期為10秒鐘.類似session的還有很多.如: 1、 page,其范圍是在一個頁面內,跳轉到其他頁面在該頁面設置的值是訪...
居巢區(qū)壓力: ______ 轉: oracle session通常具有三個特征: (1)一個session可能阻塞多個session; (2)一個session最多被一個session阻塞; (3)session阻塞關系不會形成環(huán)路.(環(huán)路即死鎖,oracle能自動解除)因此session的阻塞關系為一棵樹,進而DB系...