首页 > 其他分享 >Drools业务规则管理系统25_Drools入门案例3

Drools业务规则管理系统25_Drools入门案例3

时间:2024-03-28 15:13:21浏览次数:16  
标签:Drools 管理系统 优惠 Order 引擎 25 规则 order

一、业务场景说明

 业务场景:消费者在图书商城购买图书,下单后需要在支付页面显示订单优惠后的价格。具体优惠规则如下:

  

二、开发实现

 1、导入核心依赖

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>7.6.0.Final</version>
        </dependency>

 2、根据drools要求创建resources/META-INF/kmodule.xml配置文件
  注意:上面配置文件的名称和位置都是固定写法,不能更改

<?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"/>
    </kbase>
</kmodule>

  

 3、创建实体类Order

package com.wql.model;

import lombok.Data;

/**
 * @author wql
 * @date 2021/12/12 19:57
 */
@Data
public class Order {
    /**
     * 订单原始价格,即优惠前价格
     */
    private Double originalPrice;

    /**
     * 订单真实价格,即优惠后价格
     */
    private Double realPrice;
}

 4、创建规则文件resources/rules/bookDiscount.drl

package com.wql.Order
import com.wql.model.Order

//规则一:所购图书总价在100元以下的没有优惠
rule "book_discount_1"
    when
        $order:Order(originalPrice < 100)
    then
        $order.setRealPrice($order.getOriginalPrice());
        System.out.println("成功匹配到规则一:所购图书总价在100元以下的没有优惠");
end

//规则二:所购图书总价在100到200元的优惠20元
rule "book_discount_2"
    when
        $order:Order(originalPrice < 200 && originalPrice >= 100)
    then
        $order.setRealPrice($order.getOriginalPrice() - 20);
        System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");
end

//规则三:所购图书总价在200到300元的优惠50元
rule "book_discount_3"
    when
        $order:Order(originalPrice <= 300 && originalPrice >= 200)
    then
        $order.setRealPrice($order.getOriginalPrice() - 50);
        System.out.println("成功匹配到规则三:所购图书总价在200到300元的优惠50元");
end

//规则四:所购图书总价在300元以上的优惠100元
rule "book_discount_4"
    when
        $order:Order(originalPrice >= 300)
    then
        $order.setRealPrice($order.getOriginalPrice() - 100);
        System.out.println("成功匹配到规则四:所购图书总价在300元以上的优惠100元");
end

 5、编写单元测试

  @Test
    public void Test01() {
        KieServices kieServices = KieServices.Factory.get();
        KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
        //会话对象,用于和规则引擎交互
        KieSession kieSession = kieClasspathContainer.newKieSession();

        //构造订单对象,设置原始价格,由规则引擎根据优惠规则计算优惠后的价格
        Order order = new Order();
        order.setOriginalPrice(210D);

        //将数据提供给规则引擎,规则引擎会根据提供的数据进行规则匹配
        kieSession.insert(order);

        //激活规则引擎,如果规则匹配成功则执行规则
        kieSession.fireAllRules();
        //关闭会话
        kieSession.dispose();

        System.out.println("优惠前原始价格:" + order.getOriginalPrice() +
                ",优惠后价格:" + order.getRealPrice());
    }

 6、测试结果:

  

 通过上面的入门案例我们可以发现,使用drools规则引擎主要工作就是编写规则文件,在规则文件中定义跟业务相关的业务规则,例如本案例定义的就是图书优惠规则。规则定义好后就需要调用drools提供的API将数据提供给规则引擎进行规则模式匹配,规则引擎会执行匹配成功的规则并将计算的结果返回给我们。
 可能大家会有疑问,就是我们虽然没有在代码中编写规则的判断逻辑,但是我们还是在规则文件中编写了业务规则,这跟在代码中编写规则有什么本质的区别呢?

 我们前面其实已经提到,使用规则引擎时业务规则可以做到动态管理。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更新、统计、提交业务规则等。这样就可以做到在不重启服务的情况下调整业务规则。

三、小结

 1、规则引擎构成

  drools规则引擎由以下三部分构成:

    • Working Memory(工作内存)
    • Rule Base(规则库)
    • Inference Engine(推理引擎)

  其中Inference Engine(推理引擎)又包括:

    • Pattern Matcher(匹配器) 具体匹配哪一个规则,由这个完成
    • Agenda(议程)
    • Execution Engine(执行引擎)

    

 2、相关概念说明

  • Working Memory:工作内存

   drools规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,所以我们开发的应用程序只需要将我们的数据插入到Working Memory中即可
例如本案例中我们调用kieSession就是将order对象插入到了工作内存中。

  • Fact:事实

   是指在drools 规则应用当中,将一个普通的JavaBean插入到Working Memory后的对象就是Fact对象,例如本案例中的Order对象就属于Fact对象。Fact对象是我们的应用和规则引擎进行数据交互的桥梁或通道。

  • Rule Base:规则库

   我们在规则文件中定义的规则都会被加载到规则库中。

  • Pattern Matcher:匹配器

   将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入Agenda中。

  • Agenda:议程

   用于存放通过匹配器进行模式匹配后被激活的规则。

  • Execution Engine:执行引擎

   执行Agenda中被激活的规则。

  (1) 将初始数据(fact)输入至工作内存(working Memory)
  (2) 使用Pattern Matcher将规则库中的规则(rule)和数据(fact)比较
  (3) 如果执行规则存在冲突(conflict),即同时激活了多个规则,将冲突的规则放入冲突集合
  (4) 解决冲突,将Agenda
  (5) 执行Agenda中的规则,重复2-5,直到执行完毕Agenda中的所有规则

四、KIE介绍

 我们在操作Drools时经常使用的API以及它们之间的关系如下图:

  

 通过上面的核心API可以发现,大部分类名都是以Kie开头。Kie全称为Knowledge Is Everything,即"知识就是一切"的缩写,是Jboss一系列项目的总称。如下图所示,Kie的主要模块有OptaPlanner、Drools、UberFire、jBPM。

  

 通过上图可以看到,Drools是整个KIE项目中的一个组件,Drools中还包括一个Drools-WB的模块,它是一个可视化的规则编辑器;

 

标签:Drools,管理系统,优惠,Order,引擎,25,规则,order
From: https://www.cnblogs.com/ajing2018/p/18101722

相关文章

  • IT运维综合管理系统:提升效率、降低成本、保障安全
       随着信息技术的快速发展,企业对IT运维的需求也越来越高。IT运维综合管理系统作为一种集成化的解决方案,可以帮助企业提升运维效率、降低成本、保障信息安全。本文将从以下几个方面介绍IT运维综合管理系统的功能和优势。一、统一管理与监控   IT运维综合管理系统......
  • Drools业务规则管理系统25_规则引擎概述2
    一、什么是规则引擎规则引擎,全称为业务规则管理系统,英文名为BRMS(即BusinessRuleManagementSystem)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。需要注意的是规则引擎并......
  • [转帖]PCIe7.0宣布即将2025推出
    https://zhuanlan.zhihu.com/p/532935941 jiu导言在2022年的PCI-SIG的开发者大会上,PCI-SIG总裁庆祝了PCI-SIG成立30周年并宣布PCIe技术的下一代技术展望,并且计划在2025年向成员发布PCIe7.0标准。而在未来3年中即将推出的PCIe7.0再次提供速度提升(相比较PCIe6.0翻倍,X16双......
  • springboot/ssm城乡居民基本医疗信息管理系统Java医院挂号问诊系统web
    springboot/ssm城乡居民基本医疗信息管理系统Java医院挂号问诊系统web基于springboot(可改ssm)+vue项目开发语言:Java框架:springboot/可改ssm+vueJDK版本:JDK1.8(或11)服务器:tomcat数据库:mysql5.7(或8.0)数据库工具:Navicat/sqlyog开发软件:eclipse//idea依赖管理包:Mave......
  • 【附源码】django计算机毕业设计web的学生作业管理系统(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今信息化、数字化的教育环境中,学生作业管理已成为教学过程中不可或缺的一部分。传统的作业管理方式,如纸质作业本、电子邮件提交等,存在着效率低下、资源......
  • 【附源码】django计算机毕业设计病房管理系统设计与实现(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在现代医疗体系中,病房管理是医院运营的重要组成部分。随着科技的不断进步和信息化水平的提高,传统的手工或半自动化的病房管理模式已经无法满足现代医疗服务......
  • Centos7.5+k8s 1.25.0 部署手册
    目录Centos7.5+k8s1.25.0部署手册一、系统准备升级内核!!!1.环境信息(采用2个master节点+3个node节点),操作系统均为Centos7.52./etc/hosts文件修改3.关闭swap4.关闭防火墙5.关闭selinux6.更改yum源为阿里云7.配置所需依赖8.配置免密登录(master上执行,可省)9.配置主机名10.配......
  • 20231325贾罗祁 2023-2024-2《Python程序设计》实验二报告
    20231325贾罗祁2023-2024-2《Python程序设计》实验二报告课程:《Python程序设计》班级:2313姓名:贾罗祁学号:20231325实验教师:王志强实验日期:2024年3月27日必修/选修:公选课1.实验内容设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善;考核基本语法、判定......
  • 基于java+springboot+vue实现的超市货品信息管理系统(文末源码+Lw+ppt)23-355
    摘 要随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的超市货品信息管理系统。当前的信息管理存在工作效率低,工作繁杂等问题,基于信息化的超市货品......
  • 基于java+springboot+vue实现的超市管理系统(文末源码+Lw+ppt)23-354
    摘 要系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对超市管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的思想,在超市管理系统实现了员工信息、......