一、理解

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文件中使用insertupdatemodifydelete等方法时,会导致工作内存的对象更新,导致规则的重新匹配。

3、那么何时使用不同的Session呢?

1、如果说我们只是验证一下规则,那么用无状态的Session。

比如:

  1. 验证用户是否有开银行卡的条件。
  2. 计算订单金额的折扣。

即一步就可以完成。

2、如果说我们的规则需要多步来完成,则可以用有状态的Session。

比如:

  1. 向Session中插入Fact对象A,然后触发规则。
  2. 执行一段Java代码
  3. 向Session中插入Fact对象B,然后触发规则,此时的规则需要依赖上一步规则的数据。

即需要关联的多步来完成。

二、需求

我们自己有一个Count对象,该对象存在cntname2个属性。

规则文件中存在如下2个规则

规则一:

      如果工作内存中存在Count对象,则将Count对象的cnt属性加1

规则二:

      如果工作内存中存在2Count对象,一个对象的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>

此处需要注意ksessiontype的值,无状态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 sessionstateless session是有ksession中的type的值决定的。

3、stateless sessionexecute执行完之后,会清除工作内存中的数据,而stateful sessionfireAllRules则不会清除,除非调用了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理解的更多相关文章

  1. session理解

    Session,底层的实现就是一个Map<集合>,有些Data在Server内存中,APP要分层.Data在各个层之间肯定要以一种形态传递(泛型),之前Servlet dao.getLis ...

  2. JAVA EE中session的理解

    转自[互动百科]http://www.baike.com/wiki/Session   Session Session:在计算机中,尤其是在网络应用中,称为“会话”.Session直接翻译成中文比较困 ...

  3. 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session

    什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...

  4. tornado--之cookie自定义(还有session)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhAAAAHzCAIAAAD+WrNvAAAgAElEQVR4nOy993cTV7/vf/6qu865ob

  5. 关于Session

    转自:http://blog.csdn.net/wang379275614/article/details/9627755 Session理解:   Session:在计算机中,尤其是在网络应用中,称 ...

  6. python/数据库操作补充—模板—Session

    python/数据库操作补充—模板—Session 一.创建一个app目录 在models.py只能类进行进行创建表 class Foo: xx= 字段(数据库数据类型) 字段类型 字符串 Email ...

  7. 深入Session

    早上考虑Spring MVC和Structs2项目共用时看到一个问题,如何保持session一致?Session是怎么样被服务器处理的呢,Spring MVC中是如何封装处理Session并在不同请求 ...

  8. 【Redis】分布式Session

    一.问题引出 1.1 Session的原理 1.2 问题概述 二.解决方案 三.代码实现-使用Token代替Session 3.1 Service 3.2 TokenController 一.问题引出 ...

  9. php--->cookie和session

    cookie和session cookie和session理解 HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有 ...

随机推荐

  1. MySQL主从复制(异步复制与半同步复制)

    1.MySQl主从复制 原理:将主服务器的binlog日志复制到从服务器上执行一遍,达到主从数据的一致状态. 过程:从库开启一个I/O线程,向主库请求Binlog日志.主节点开启一个binlog du ...

  2. Markdown语法1

    Markdown是一种轻量级标记语言. Markdown 编写的文档可以导出 HTML .Word.图像.PDF.Epub 等多种格式的文档. Markdown 编写的文档后缀为 .md, .mark ...

  3. 7. Github Pages 搭建网站

    7. Github Pages 搭建网站 个人站点 访问 https://用户名.github.io 搭建步骤 1) 创建个人站点   ->  新建仓库(注:仓库名必须是[用户名.github. ...

  4. css 垂直居中方法汇总

    查看原文可以有更好的排版效果哦 前言 居中是平时工作中的最常见的一种需求,各种图片居中或者各种弹窗,水平居中还好,特别是垂直居中,很多初学者表示太难写了,现在列举一些常用的方法. 实战 这里只讲述cs ...

  5. ES6-11学习笔记--Map

    Map:一种新的数据结构 常用方法 遍历 应用场景 WeakMap   常用方法: let map = new Map() let obj = { name: '张三' } map.set(obj, ...

  6. Android实现蓝牙远程连接遇到的问题

    主要问到的问题:1.uuid获取不到,一直为空,后来发现android4.2之前使用uuid这种方法,目前尽量不使用uuid方式 2.socket.connect()出错,报read failed, ...

  7. leetcode921. 使括号有效的最少添加

    题目描述: 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效. 从形式上讲,只有满足下面几点之一,括号字 ...

  8. wx.getImageInfo和wx.downloadFile下载用户头像报错(小程序canvas以及小程序图片下载部分)

    我先上图 之前我们后台配置的 downloadFile 合法域名是 https://wx.qlogo.cn,   用了好久都没出问题,  前段时间,  用户反馈  分享海报,  用户头像出不来!!!! ...

  9. Conda 配置 Python 环境

    目录 前言 一.Conda 是什么 二.如何获取 三.使用 Conda 命令配置多环境 1.创建新环境 2.激活新环境 3.配置新环境 4.退出新环境 5.检查所有环境 6.检查所有安装的包 7.删除 ...

  10. SpringMVC的数据响应-回写数据

    1.直接返回字符串 其他具体代码请访问chilianjie @RequestMapping("/report5") public String save5(HttpServletR ...