侧边栏壁纸
  • 累计撰写 2,058 篇文章
  • 累计创建 73 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

关于Drools Session的有状态和无状态

大猿本猿
2021-11-14 / 1,267 阅读 / 0 字

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());

    }