千家信息网

drools的有状态Session和无状态Session是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了drools的有状态Session和无状态Session是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇drools的有状态Session和无状态S
千家信息网最后更新 2026年10月31日drools的有状态Session和无状态Session是什么

这篇文章主要介绍了drools的有状态Session和无状态Session是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇drools的有状态Session和无状态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包

                            org.drools            drools-bom            pom            7.69.0.Final            import                        org.drools        drools-compiler                org.drools        drools-mvel                ch.qos.logback        logback-classic        1.2.11                org.projectlombok        lombok        1.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"    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层面更好理解。

    关于"drools的有状态Session和无状态Session是什么"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"drools的有状态Session和无状态Session是什么"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

    状态 对象 规则 方法 内存 数据 工作 文件 不同 之间 时间 知识 结果 推理 输出 迭代 代码 内容 就是 属性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北九亚互联网络科技有限公司 金融科技还是互联网 互联网品科技 没上市的科技互联网公司 万易互联网科技有限公司 百单互联网科技有限公司 互联网科技论坛 联恩商钥互联网科技有限公司 互联网公司会议桌创意科技软装饰 卫星互联网科技股票 互联网科技与大数据专业 注册互联网科技公司经营范围大全 电子科技大学互联网创业大赛 乌鲁木齐新华智原互联网科技学校 锡山区互联网智能科技产品供应 杭州披云加互联网科技有限公司 富国互联网金融科技混合基金 本届互联网大会上的黑科技 网互联网络科技 武汉亿视互联网科技有限公司 圆梦互联网科技 港股互联网科技股 中国互联网科技发展 碳银互联网科技有限公司 互联网软件和科技 开一家科技互联网公司需要多少钱 互联网科技研发水平 玉溪新华互联网科技好不好 四川慕妮娅互联网科技有限公司 电子商务与互联网科技的关系
    0