聊聊drools|聊聊drools session的不同
目录
- 一、理解
- 1、有状态Session
- 2、无状态Session
- 3、那么何时使用不同的Session呢?
- 二、需求
- 三、实现步骤
- 1、项目结构说明
- 2、引入jar包
- 3、编写Count类
- 4、编写kmodule.xml文件
- 5、编写规则文件
- 6、Stateful session运行结果
- 7、Stateless 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
文件中使用insert
或update
或modify
或delete
等方法时,会导致工作内存的对象更新,导致规则的重新匹配。3、那么何时使用不同的Session呢?
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,看结果有什么不同。
三、实现步骤
1、项目结构说明
文章图片
2、引入jar包
org.drools drools-bompom 7.69.0.Final importorg.drools drools-compilerorg.drools drools-mvelch.qos.logback logback-classic1.2.11 org.projectlombok lombok1.18.22
3、编写Count类
@Data@AllArgsConstructorpublic class Counter {/*** 名称*/private String name; /*** 计数*/private Integer cnt; }
就是一个普通的java对象。
4、编写kmodule.xml文件
此处需要注意
ksession
中type
的值,无状态Session和有状态Session的值不一致,不写type,默认就是有状态Session。5、编写规则文件
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"); end
6、Stateful session运行结果
文章图片
1、因为是有状态的Session,在多次
fireAllRules
的时候,上次插入到工作内存的对象还是存在的。即Session的数据保留了
。2、有状态Session在执行完之后,必须要调用
dispose
方法,避免内存泄漏。7、Stateless Session运行结果
文章图片
无状态的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层面更好理解。
五、完整代码 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|聊聊drools session的不同】到此这篇关于drools session理解的文章就介绍到这了,更多相关drools session内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 深入浅析drools中Fact的equality|深入浅析drools中Fact的equality modes
- drools中使用function的方法小结
- 聊聊Redis热点key热点问题
- drools中query的使用
- 汽车|聊聊汽车行业的ESG之争 | 汽车科技观察家
- Web的Cookies,Session,Application
- 聊聊golang的Pseudo-versions
- 四大作用域(application,session,request,page)
- 双目摄像头|双目摄像头 三维坐标 python_聊聊三维重建-双目立体视觉原理
- 双目三维重建_聊聊三维重建双目立体视觉原理