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协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有 ...
随机推荐
- c的free 为什么不需要知道大小
malloc malloc函数在运行时分配内存.它需要以字节为单位的大小并在内存中分配那么多空间.这意味着malloc(50)将在内存中分配50个字节.它返回一个void指针 calloc 与mall ...
- CSS3 用border写 空心三角箭头 (两种写法)
之前一直在寻找这种空心三角箭头, 终于知道了原理! 自己记录一下,顺便分享给之前跟我一样想要的撸友们~ 第一种写法 利用常见的 after伪元素 <!DOCTYPE html> <h ...
- c++实现职责链模式--财务审批
内容: 某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20 ...
- 【uniapp 开发】uni-app 资源在线升级/热更新
注:本文为前端代码资源热更新.如果是整包升级,另见文档 https://ask.dcloud.net.cn/article/34972 HBuilderX 1.6.5 起,uni-app 支持生成 A ...
- Android限制输入框内容
<EditText android:id="@+id/temper" android:hint="36.2" android:digits="1 ...
- Tomcat安装(安装版)
安装Tomcat(安装版) 下载地址https://tomcat.apache.org/ 下载成功,双击进行安装(一路Next). 等待安装结束. 然后打开浏览器输入地址:http://localho ...
- npm权限不够(安装什么都报错)
问题 Windows下使用npm安装任何包都报错, Windows下使用npm显示权限不够 如图: 解决方法 1. 方法一 使用管理员权限打开 命令窗口, 治标不治本!!!!不推荐 ...
- for 循环详解
学习目标: 掌握 for 循环的使用 学习内容: 1.for语法 for(初始化语句; boolean表达式; 循环后操作语句) { 循环体; } 流程图如下: 特点: 初始化语句:只在循环开始时执行 ...
- Uncaught TypeError: document.getElementsById is not a function
今天博主终于开始攻关javascript(俗称js)了,不过要注意了,它和java可是一丁点关系都没有,就像老婆饼和老婆一样. 下面就让我们来讨论一下博主这次犯下的低级错误吧 一.背景(解决方法在文末 ...
- 2021年iOS 开发者账号申请-最新
前言 现在已经是2021年了,中国国内的互联网生态国家管控越来越严禁,国家反垄断法,未成年人游戏限制,整治娱乐圈不良文化,出台公民网络个人信息保护法,全网进行app 应用进行安全审查,等等等,无不意味 ...