drools 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和name2个属性。
规则文件中存在如下2个规则
规则一:
如果工作内存中存在Count对象,则将Count对象的cnt属性加1
规则二:
如果工作内存中存在2个Count对象,一个对象的name=count-01另一个对象的name=count-02则输出ok字符串。
针对有状态Session和无状态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" 表示有状态的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。
5、编写规则文件
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、因为是有状态的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 session理解的更多相关文章
- session理解
Session,底层的实现就是一个Map<集合>,有些Data在Server内存中,APP要分层.Data在各个层之间肯定要以一种形态传递(泛型),之前Servlet dao.getLis ...
- JAVA EE中session的理解
转自[互动百科]http://www.baike.com/wiki/Session Session Session:在计算机中,尤其是在网络应用中,称为“会话”.Session直接翻译成中文比较困 ...
- 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session
什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...
- tornado--之cookie自定义(还有session)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhAAAAHzCAIAAAD+WrNvAAAgAElEQVR4nOy993cTV7/vf/6qu865ob
- 关于Session
转自:http://blog.csdn.net/wang379275614/article/details/9627755 Session理解: Session:在计算机中,尤其是在网络应用中,称 ...
- python/数据库操作补充—模板—Session
python/数据库操作补充—模板—Session 一.创建一个app目录 在models.py只能类进行进行创建表 class Foo: xx= 字段(数据库数据类型) 字段类型 字符串 Email ...
- 深入Session
早上考虑Spring MVC和Structs2项目共用时看到一个问题,如何保持session一致?Session是怎么样被服务器处理的呢,Spring MVC中是如何封装处理Session并在不同请求 ...
- 【Redis】分布式Session
一.问题引出 1.1 Session的原理 1.2 问题概述 二.解决方案 三.代码实现-使用Token代替Session 3.1 Service 3.2 TokenController 一.问题引出 ...
- php--->cookie和session
cookie和session cookie和session理解 HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有 ...
随机推荐
- 实用的 CSS — 贝塞尔曲线(cubic-bezier)
欢迎移步我的博客阅读:<实用的 CSS - 贝塞尔曲线(cubic-bezier)> 前言 在了解 cubic-bezier 之前,你需要对 CSS3 中的动画效果有所认识,它是 anim ...
- H5使用Canvas绘图
一.什么是Canvas Canvas 是H5的一部分,允许脚本语言动态渲染图像.Canvas 定义一个区域,可以由html属性定义该区域的宽高,javascript代码可以访问该区域,通过一整套完整的 ...
- ES6-11学习笔记--代理Proxy
Proxy代理 常用拦截方法 ES5拦截: let obj = {} let newVal = '' Object.defineProperty(obj, 'name', { get() { cons ...
- leetcode-剑指 Offer II 012. 左右两边子数组的和相等
题目描述: 给你一个整数数组 nums ,请计算数组的 中心下标 . 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和. 如果中心下标位于数组最左端,那么左侧数之和视为 ...
- 【Android开发】Bitmap的质量压缩法
public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputS ...
- JBOSS 7.1.1上的DB2和Orcale数据库配置
将IBM DB2和Oracle数据源配置到JBOSS 7.1.1 第1步: 打开Standalone.xml文件将以下代码添加到数据源的子系统中,并根据数据库URL和数据源的用户名和密 ...
- IDEA中 mybatis-config、applicationContext.xml、log4j.properties、SpringMVC等文件没有图标标识符号,不是一个xml文件
1. 举例说明 mybatis-config.xml文件不显示图标,识别不出该xml文件 2. 解决办法 1)先点击 File -> Settings-,然后贴入下面代码 (2) 具体操作如下图 ...
- fetch和axios区别,摘自Stack Overflow网站答案
fetch 请求let url = 'https://someurl.com'; let options = { method: 'POST', mode: 'cors', headers: { 'A ...
- 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?
之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...
- 掌握JavaScript中的迭代器和生成器,顺便了解一下async、await的原理
掌握JavaScript中的迭代器和生成器,顺便了解一下async.await的原理 前言 相信很多人对迭代器和生成器都不陌生,当提到async和await的原理时,大部分人可能都知道async.aw ...