1.无状态会话和有状态会话到底是什么
[[<无标题笔记> id=5bb8d72c-eab4-4c72-92f7-35fb0a05ef18]]
[[<无标题笔记> id=27055424-015f-487d-ae83-02d5d468593d]]
[[<无标题笔记> id=f59ce12f-1bba-427a-88a0-7e4ccba442a9]]
2.有状态和状态Session在程序中的设置
2.1kmodule.xml配置文件
drools默认session是有状态的,通过KieContainer可以获取KieSession,在kmodule.xml配置文件中如果不指定ksession的type默认也是有状态的session。
<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<!--
name:指定kbase的名称,可以任意,但是需要唯一
packages:指定规则文件的目录,需要根据实际情况填写,否则无法加载到规则文件
default:指定当前kbase是否为默认
-->
<kbase name="myKbase1" packages="rules" default="true">
<!--
name:指定ksession名称,可以任意,但是需要唯一
default:指定当前session是否为默认
-->
<ksession name="ksession-rule" default="true" type="stateful"/>
</kbase>
</kmodule>
2.2使用kiesession的步骤
有状态:
使用KieSession的一般步骤为,获取session,insert Fact对象,然后调用fireAllRules进行规则匹配,随后调用dispose方法关闭session。
/**
* 测试Drools是否可以正常启动,有状态session
*/
@Test
public void test1(){
KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
//会话对象,用于和规则引擎交互
KieSession kieSession = kieClasspathContainer.newKieSession();
//构造订单对象,设置原始价格,由规则引擎根据优惠规则计算优惠后的价格
Order order = new Order();
order.setOriginalPrice(680);
order.setGoodsNum(3);
//将数据提供给规则引擎,order
kieSession.insert(order);
System.out.println("优惠后的价格1:"+order.getDiscountPrice());
//激活规则引擎,如果规则匹配成功则执行规则
kieSession.fireAllRules();
System.out.println("优惠后的价格2:"+order.getDiscountPrice());
order.setOriginalPrice(order.getDiscountPrice());
kieSession.insert(order);
System.out.println("优惠后的价格3:"+order.getDiscountPrice());
//关闭会话
kieSession.dispose();
System.out.println("优惠后的价格4:"+order.getDiscountPrice());
}
无状态:
StatelessKieSession提供了一个更加便利的API,是对KisSession的封装,不再调用dispose方法进行session的关闭。它隔离了每次与规则引擎的交互,不会再去维护会话的状态。同时也不再提供fireAllRules方法。
/**
* 测试Drools是否可以正常启动,无状态session
*/
@Test
public void test2(){
KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
//会话对象,用于和规则引擎交互
StatelessKieSession kieSession = kieClasspathContainer.newStatelessKieSession();
//构造订单对象,设置原始价格,由规则引擎根据优惠规则计算优惠后的价格
Order order = new Order();
order.setOriginalPrice(680);
order.setGoodsNum(3);
//将数据提供给规则引擎,order
kieSession.execute(order);
System.out.println("优惠后的价格:"+order.getDiscountPrice());
}