当前位置: 首页 > 后端技术 > Java

Drools会话理解

时间:2023-04-01 21:26:42 Java

1、理解drools中有两种会话,一种是有状态会话(StatefulSession),一种是无状态会话(StatelessSession)。1.那么它们有什么区别呢?2、什么时候用有状态的Session,什么时候用无状态的Session?这是我的理解。1.StatefulSessionStatefulSession是使用推理随着时间的推移迭代地改变事实对象的会话。在有状态会话中,来自先前会话调用的数据(先前会话状态)在会话调用之间被保留,而在无状态会话中,该数据被丢弃。2.无状态会话无状态会话是不使用推理随时间迭代改变事实对象的会话。来自先前调用无状态会话的数据不会在会话之间保留。说明:无状态会话是对不使用推理随时间迭代改变事实对象的会话的理解。我的理解是针对JavaApi的。1.在无状态会话中,只有execute方法,多次调用execute方法不会影响上一个execute方法中下一个execute方法的执行。2.当drl文件中使用insert或update或modify或delete等方法时,会更新工作内存中的对象,重新匹配规则。3.那么什么时候使用不同的Session呢?1.如果我们只是验证规则,那么就使用statelessSession。例如:验证用户是否具备开立银行卡的条件。计算订单金额的折扣。即可以一步完成。2.如果我们的规则需要分多个步骤完成,我们可以使用有状态的Session。例如:将Fact对象A插入到Session中,然后触发规则。执行一段Java代码将Fact对象B插入到Session中,然后触发规则。此时的规则需要依赖之前规则的数据。也就是说,它需要通过与其关联的多个步骤来完成。其次,我们需要自己有一个Count对象,它有两个属性:cnt和name。规则文件中有如下两条规则规则1:如果工作内存中有Count对象,则将Count对象的cnt属性加1规则2:如果工作内存中有2个Count对象,名称一个object=count-01和另一个name=count-02的对象输出ok字符串。对于有状态Session和无状态Session,看结果的区别。三、实际步骤1、项目结构说明2、引入jar包org.droolsdrools-bompom7??.69.0.Finalimportorg.droolsdrools-compilerorg.droolsdrools-mvelch.qos。logbacklogback-classic<版本>1.2.11org.projectlomboklombok1.18.223.编写Count类@Data@AllArgsConstructorpublic类Counter{/***名称*/私有字符串名称;/***count*/privateIntegercnt;}是一个普通的java对象4.编写kmodule.xml文件这里需要注意ksession中type的值。statelesssession和statefulsession的值不一致。如果不写type,默认是statefulsession。5.编写规则文件packagerules.statefulimportcom.huan.drools.Counter//增加计数器规则"stateful_rule_count_increment"中cnt的值当$counter:Counter()then$counter.setCnt($counter.getCnt()+1);System.out.println("rule_count_increment:countname:["+$counter.getName()+"],cnt=["+$counter.getCnt()+"]");end//如果两个都算-01和counter-02存在于工作内存中,然后输出okrule"stateful_rule_count_exists"whenCounter(name=="count-01")andCounter(name=="count-02")thenSystem.out.println("ok");end六、Statefulsession运行结果1、由于是statefulsession,多次触发fireAllRules时,上次插入工作内存的对象依然存在。即保留Session数据。2.statefulSession执行后,必须调用dispose方法,避免内存泄露。7、StatelessSession运行结果statelessSession,因为session数据会丢失,所以ok没有输出。四、注意事项1、drl文件中,当使用insert\update\modify\delete等方法时,会重新匹配规则。2、Java代码中能否获取statefulsession或statelesssession是由ksession中type的值决定的。3、statelesssession执行execute后会清除workingmemory中的数据,而statefulsession不会在fireAllRules中清除,除非调用dispose方法。4.个人对stateful和stateless的理解,从api层面比较好理解。5.完整代码https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-session6.参考文档1.https://docs.drools.org/7.69.0.Final/drools-docs/html_single/index.html#kie-sessions-con_decision-engine2,https://www.javainuse.com/drools_states3,https://groups.google.com/g/drools-usage/c/qYbqiS1ht4g