首页 > 其他分享 >drools 规则引擎--文档

drools 规则引擎--文档

时间:2023-09-16 15:33:00浏览次数:30  
标签:drools -- 创建 按钮 点击 文档 user && 规则

目的,方便随时查看。

 

规则引擎 Drools

1. 问题引出

现有一个在线申请信用卡的业务场景,用户需要录入个人信息,如下图所示:


通过上图可以看到,用户录入的个人信息包括姓名、性别、年龄、学历、电话、所在公司、职位、月收入、是否有房、是否有车、是否有信用卡等。录入完成后点击申请按钮提交即可。

用户提交申请后,需要在系统的服务端进行用户信息合法性检查(是否有资格申请信用卡),只有通过合法性检查的用户才可以成功申请到信用卡(注意:不同用户有可能申请到的信用卡额度不同)。

检查用户信息合法性的规则如下:

规则编号

名称

描述

1

检查学历与薪水1

如果申请人既没房也没车,同时学历为大专以下,并且月薪少于5000,那么不通过

2

检查学历与薪水2

如果申请人既没房也没车,同时学历为大专或本科,并且月薪少于3000,那么不通过

3

检查学历与薪水3

如果申请人既没房也没车,同时学历为本科以上,并且月薪少于2000,同时之前没有信用卡的,那么不通过

4

检查申请人已有的信用卡数量

如果申请人现有的信用卡数量大于10,那么不通过

用户信息合法性检查通过后,还需要根据如下信用卡发放规则确定用户所办信用卡的额度:

规则编号

名称

描述

1

规则1

如果申请人有房有车,或者月收入在20000以上,那么发放的信用卡额度为15000

2

规则2

如果申请人没房没车,但月收入在10000~20000之间,那么发放的信用卡额度为6000

3

规则3

如果申请人没房没车,月收入在10000以下,那么发放的信用卡额度为3000

4

规则4

如果申请人有房没车或者没房但有车,月收入在10000以下,那么发放的信用卡额度为5000

5

规则5

如果申请人有房没车或者是没房但有车,月收入在10000~20000之间,那么发放的信用卡额度为8000

思考:如何实现上面的业务逻辑呢?

我们最容易想到的就是使用分支判断(if else)来实现,例如通过如下代码来检查用户信息合法性:

 

 

 

x

 


 
 
//此处为伪代码

//检查用户信息合法性,返回true表示检查通过,返回false表示检查不通过
public boolean checkUser(User user){
    //如果申请人既没房也没车,同时学历为大专以下,并且月薪少于5000,那么不通过
    if(user.getHouse() == null 
       && user.getcar() == null 
       && user.getEducation().equals("大专以下") 
       && user.getSalary < 5000){
        return false;
    }
    //如果申请人既没房也没车,同时学历为大专或本科,并且月薪少于3000,那么不通过
    else if(user.getHouse() == null 
       && user.getcar() == null 
       && user.getEducation().equals("大专或本科") 
       && user.getSalary < 3000){
        return false;
    }
    //如果申请人既没房也没车,同时学历为本科以上,并且月薪少于2000,同时之前没有信用卡的,那么不通过
    else if(user.getHouse() == null 
       && user.getcar() == null 
       && user.getEducation().equals("本科以上") 
       && user.getSalary < 2000 
       && user.getHasCreditCard() == false){
        return false;
    }
    //如果申请人现有的信用卡数量大于10,那么不通过
    else if(user.getCreditCardCount() > 10){
        return false;
    }
    return true;
}

如果用户信息合法性检查通过后,还需要通过如下代码确定用户所办信用卡的额度:

 

 

 


 
xxxxxxxxxx
 
 
 
 
//此处为伪代码

//根据用户输入信息确定信用卡额度
public Integer determineCreditCardLimit(User user){
    //如果申请人有房有车,或者月收入在20000以上,那么发放的信用卡额度为15000
    if((user.getHouse() != null && user.getcar() != null) 
       || user.getSalary() > 20000){
        return 15000;
    }
    //如果申请人没房没车,并且月收入在10000到20000之间,那么发放的信用卡额度为6000
    else if(user.getHouse() == null 
       && user.getcar() == null
       && user.getSalary() > 10000 
       && user.getSalary() < 20000){
        return 6000;
    }
    //如果申请人没房没车,并且月收入在10000以下,那么发放的信用卡额度为3000
    else if(user.getHouse() == null 
       && user.getcar() == null
       && user.getSalary() < 10000){
        return 3000;
    }
    //如果申请人有房没车或者没房但有车,并且月收入在10000以下,那么发放的信用卡额度为5000
    else if((((user.getHouse() != null && user.getcar() == null) || (user.getHouse() == null && user.getcar() != null))
       && user.getSalary() < 10000){
        return 5000;
    }
    //如果申请人有房没车或者没房但有车,并且月收入在10000到20000之间,那么发放的信用卡额度为8000
    else if((((user.getHouse() != null && user.getcar() == null) || (user.getHouse() == null && user.getcar() != null))
       && (user.getSalary() > 10000 && user.getSalary() < 20000)){
        return 8000;
    }
}
 

 

 

 

通过上面的伪代码我们可以看到,我们的业务规则是通过Java代码的方式实现的。这种实现方式存在如下问题:

1、硬编码实现业务规则难以维护

2、硬编码实现业务规则难以应对变化

3、业务规则发生变化需要修改代码,重启服务后才能生效

 

那么面对上面的业务场景,还有什么好的实现方式吗?

答案是规则引擎

2. 规则引擎概述

2.1 什么是规则引擎

规则引擎,全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。

需要注意的是规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务规则管理系统。目前市面上具体的规则引擎产品有:drools、VisualRules、iLog等。

规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。规则引擎其实就是一个输入输出平台。

上面的申请信用卡业务场景使用规则引擎后效果如下:


系统中引入规则引擎后,业务规则不再以程序代码的形式驻留在系统中,取而代之的是处理规则的规则引擎,业务规则存储在规则库中,完全独立于程序。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更新、统计、提交业务规则等。业务规则被加载到规则引擎中供应用系统调用。

2.2 使用规则引擎的优势

使用规则引擎的优势如下:

1、业务规则与系统代码分离,实现业务规则的集中管理

2、在不重启服务的情况下可随时对业务规则进行扩展和维护

3、可以动态修改业务规则,从而快速响应需求变更

4、规则引擎是相对独立的,只关心业务规则,使得业务分析人员也可以参与编辑、维护系统的业务规则

5、减少了硬编码业务规则的成本和风险

6、使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单

2.3 规则引擎应用场景

对于一些存在比较复杂的业务规则并且业务规则会频繁变动的系统比较适合使用规则引擎,如下:

1、风险控制系统----风险贷款、风险评估

2、反欺诈项目----银行贷款、征信验证

3、决策平台系统----财务计算

4、促销平台系统----满减、打折、加价购

2.4 Drools介绍

drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。

drools官网地址:https://drools.org/

drools源码下载地址:https://github.com/kiegroup/drools

在项目中使用drools时,即可以单独使用也可以整合spring使用。如果单独使用只需要导入如下maven坐标即可:

 

 

 


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

 

 

如果我们使用IDEA开发drools应用,IDEA中已经集成了drools插件。如果使用eclipse开发drools应用还需要单独安装drools插件。

drools API开发步骤如下:

3. Drools入门案例

本小节通过一个Drools入门案例来让大家初步了解Drools的使用方式、对Drools有一个整体概念。

3.1 业务场景说明

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

规则编号

规则名称

描述

1

规则一

所购图书总价在100元以下的没有优惠

2

规则二

所购图书总价在100到200元的优惠20元

3

规则三

所购图书总价在200到300元的优惠50元

4

规则四

所购图书总价在300元以上的优惠100元

现在需要根据上面的规则计算优惠后的价格。

3.2 开发实现

第一步:创建maven工程drools_quickstart并导入drools相关maven坐标

 

 

 

xxxxxxxxxx
 
 
 
 
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>7.10.0.Final</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

 

 

第二步:根据drools要求创建resources/META-INF/kmodule.xml配置文件

 

 

 

xxxxxxxxxx
 
 
 
 
<?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>
 

 

 

 

drools 规则引擎--文档_规则引擎

 

drools 规则引擎--文档_规则引擎_02

drools 规则引擎--文档_规则引擎_03

drools 规则引擎--文档_Memory_04

drools 规则引擎--文档_规则引擎_05

drools 规则引擎--文档_Memory_06

drools 规则引擎--文档_用户信息_07

drools 规则引擎--文档_用户信息_08

drools 规则引擎--文档_Memory_09

drools 规则引擎--文档_用户信息_10

drools 规则引擎--文档_规则引擎_11

drools 规则引擎--文档_Memory_12

登录成功后进入系统首页:


8.3 使用方式

8.3.1 创建空间、项目

WorkBench中存在空间和项目的概念。我们在使用WorkBench时首先需要创建空间(Space),在空间中创建项目,在项目中创建数据对象、规则文件等。

  • 创建空间
    第一步:登录WorkBench后进行系统首页,点击首页中的Design区域进入项目列表页面:


    如果是第一次登录还没有创建项目则无法看到项目
    第二步:点击左上角Spaces导航链接进入空间列表页面


    第三步:点击右上角Add Space按钮弹出创建添加空间窗口


    录入空间名称,点击Save按钮则完成空间的创建,如下图:
  • 创建项目
    前面已经提到,我们在WorkBench中需要先创建空间,在空间中才能创建项目。上面我们已经创建了一个空间itheima,现在需要住此空间中创建项目。
    第一步:点击itheima空间,进入此空间


    可以看到当前空间中还没有项目
    第二步:点击Add Project按钮弹出添加项目窗口


    第三步:在添加项目窗口中录入项目名称(例如项目名称为pro1),点击Add按钮完成操作


    可以看到在完成项目创建后,系统直接跳转到了项目页面。要查看当前itheima空间中的所有项目,可以点击左上角itheima链接:

8.3.2 创建数据对象

数据对象其实就是JavaBean,一般都是在drl规则文件中使用进行规则匹配。

第一步:在itheima空间中点击pro1项目,进入此项目页面


第二步:点击Create New Asset按钮选择“数据对象”


第三步:在弹出的创建数据对象窗口中输入数据对象的名称,点击确定按钮完成操作


操作完成后可以看到如下:


第四步:点击“添加字段”按钮弹出新建字段窗口


第五步:在新建字段窗口中录入字段Id(其实就是属性名),选择类型,点击创建按钮完成操作


完成操作后可以看到刚才创建的字段:


可以点击添加字段按钮继续创建其他字段:


注意添加完字段后需要点击右上角保存按钮完成保存操作:


点击源代码按钮可以查看刚才创建的Person对象源码:


点击左上角pro1项目链接,可以看到当前pro1项目中已经创建的各种类型的对象:


8.3.3 创建DRL规则文件

第一步:在pro1项目页面点击右上角Create New Asset按钮,选择“DRL文件”,弹出创建DRL文件窗口


第二步:在添加DRL文件窗口录入DRL文件名称,点击确定按钮完成操作


第三步:上面点击确定按钮完成创建DRL文件后,页面会跳转到编辑DRL文件页面


可以看到DRL规则文件页面分为两个部分:左侧为项目浏览视图、右侧为编辑区域,需要注意的是左侧默认展示的不是项目浏览视图,需要点击上面设置按钮,选择“资料库视图”和“显示为文件夹”,如下图所示:


第四步:在编辑DRL文件页面右侧区域进行DRL文件的编写,点击右上角保存按钮完成保存操作,点击检验按钮进行规则文件语法检查


点击左上角pro1项目回到项目页面,可以看到此项目下已经存在两个对象,即person.drl规则文件和Person类:


8.3.4 创建测试场景

前面我们已经创建了Person数据对象和person规则文件,现在我们需要测试一下规则文件中的规则,可以通过创建测试场景来进行测试。

第一步:在项目页面点击Create New Asset按钮选择“测试场景”,弹出创建测试场景窗口


第二步:在弹出的创建测试场景窗口中录入测试场景的名称,点击确定完成操作


完成测试场景的创建后,页面会跳转到测试场景编辑页面,如下图:


第三步:因为我们编写的规则文件中需要从工作内存中获取Person对象进行规则匹配,所以在测试场景中需要准备Person对象给工作内存,点击“GIVEN”按钮弹出新建数据录入窗口,选择Person类,输入框中输入事实名称(名称任意),如下图


第四步:录入事实名称后点击后面的添加按钮,可以看到Person对象已经添加成功


第五步:我们给工作内存提供的Person对象还需要设置age属性的值,点击“添加字段”按钮弹出窗口,选择age属性


点击确定按钮后可以看到字段已经添加成功:


第六步:点击age属性后面的编辑按钮,弹出字段值窗口


第七步:在弹出的窗口中点击字面值按钮,重新回到测试场景页面,可以看到age后面出现输入框,可以为age属性设置值


设置好age属性的值后点击保存按钮保存测试场景

第八步:点击右上角“运行测试场景”按钮进行测试


测试成功后可以查看WorkBench部署的Tomcat控制台:


8.3.5 设置KieBase和KieSession

第一步:在pro1项目页面点击右上角Settings按钮进入设置页面


第二步:在设置页面选择“知识库和会话”选项


第三步:在弹出的知识库和会话页面点击“添加”按钮进行设置



第四步:设置完成后点击右上角保存按钮完成设置操作,可以通过左侧浏览视图点击kmodule.xml,查看文件内容


8.3.6 编译、构建、部署

前面我们已经在WorkBench中创建了一个空间itheima,并且在此空间中创建了一个项目pro1,在此项目中创建了数据文件、规则文件和测试场景,如下图:


点击右上角“Compile”按钮可以对项目进行编译,点击“Bulid&Deploy”按钮进行构建和部署。

部署成功后可以在本地maven仓库中看到当前项目已经被打成jar包:


将上面的jar包进行解压,可以看到我们创建的数据对象Person和规则文件person以及kmodule.xml都已经打到jar包中了。

8.3.7 在项目中使用部署的规则

前面我们已经在WorkBench中创建了pro1项目,并且在pro1项目中创建了数据文件、规则文件等。最后我们将此项目打成jar包部署到了maven仓库中。本小节就需要在外部项目中使用我们定义的规则。

第一步:在IDEA中创建一个maven项目并在pom.xml文件中导入相关坐标

drools 规则引擎--文档_规则引擎_13

drools 规则引擎--文档_用户信息_14

drools 规则引擎--文档_用户信息_15

drools 规则引擎--文档_规则引擎_16

drools 规则引擎--文档_规则引擎_17

drools 规则引擎--文档_规则引擎_18

drools 规则引擎--文档_规则引擎_19

标签:drools,--,创建,按钮,点击,文档,user,&&,规则
From: https://blog.51cto.com/u_16011564/7494029

相关文章

  • 相机成像模型
    详细推导了相机成像模型。小孔成像小孔成像是初中物理知识,如图所示,蜡烛发出的光线经过小孔投射在光屏上呈现出倒立的实像。以上成像过程涉及三个重要对象,即物点(蜡烛本身)、光心(小孔)、像点(光屏上的亮点),三者连起来的直线叫做光路。小孔成像是理想条件下的相机成像模型。......
  • 桶装水送水多水站送水员公众号h5开发
    桶装水送水多水站送水员公众号h5开发界面简洁易懂用户容易接受。独家一户一码全家都能订水。多个水站运营可按距离选择绑定。三种支付方式水票、微信、到付。强大员工系统老板坐享其成。自由跑跑模式可招兼职送水员接单。一户一码、全家享用一户一码,精准绑定客户,粘连性强,让客户订水......
  • 选择清除分析软件XP-CLR的安装折腾之路
    目录1.原版2.Python版本安装运行原因分析后续分析推荐1.原版安装比较简单。wgethttps://reich.hms.harvard.edu/sites/reich.hms.harvard.edu/files/inline-files/XPCLR.tartarxvfXPCLR.tar直接运行bin下的XPCLR即可,若不能运行,则编译下:cdsrcmakemakeinstall原版分析时......
  • SQL——数据操纵语言DML(INSERT,UPDATE,DELETE)、数据查询语言DQL(SELECT)、操作符
     DML数据操纵语言(DataManipulationLanguage,DML),是指在SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除,是开发以数据为中心的应用程序必定会使用到的指令。INSERT插入INSERT是将数据插入到数据库对象中的指令,......
  • C++关于字符串的一些函数
    islower,isupper返回类型为int,当符合条件时返回非零值,并不一定是1,0tolower,toupper返回类型为int。isdigit判断一个字符是否是十进制数字,返回值:返回值为非零(真)表示c是十进制数字,返回值为零(假)表示c不是十进制数字。isalphaisalpha()用来判断一个字符是否为字母,如果是字符......
  • 关于jsp借助WebServlet注解跳转到对应的servlet,表示界面404,且注解在前端界面不被识别
    问题描述我是属于那种习惯了使用其他框架之后,且,好久没有写过javaweb了,就忘记了jsp/html前端界面通过WebServlet注解跳转到servlet的方法,就这么一个破问题!!!坑了我一下午!!问题解决起初我还以为是servlet-api的依赖没有导入进去,发现早就在pom.xml文件里面好好地躺着了;当然,从始至终......
  • java安装与卸载
    Java三大版本JavaSE:标准版JavaME:嵌入式开发JavaEE:企业级开发JDK,JRE,JVMJDK:JavaDevelopmentKitJava开发工具JRE:JavaRuntimeEnvironmentJava运行环境JVM:JavaVirtualMachineJava虚拟机(一次开发,到处运行)java下载与安装  官网:https://www.java.com/zh-CN/downl......
  • mapbox点图层标注根据zoom层级进行显示与隐藏
    主要使用了这个表达式进行过滤:"text-opacity":["step",["zoom"],0,5,1]这个表达式的意思就是zoom在小于5时text-opacity值等于0,大于5时text-opacity值等于1constaddPortsGeoJSONLayer=(ports)=>{letmap=G.map;map.loadImage(portIcon,function(error,im......
  • 属性闭包计算
                 ......
  • Go 项目的 MAKE 工具
    Go项目的MAKE工具MAKE工具是Linux和Unix系统中一种常见的自动化构建工具,通常用于管理和组织软件项目。在Go语言中,使用MAKE工具可以轻松地管理和构建项目,并自动执行诸如编译、测试、安装等复杂的操作。下面将介绍如何在Go项目中使用MAKE工具,并说明其主要优势......