龙空技术网

规则引擎 Drools(一)

时间旅行vlog 438

前言:

而今兄弟们对“java贷款计算器”大致比较看重,你们都需要知道一些“java贷款计算器”的相关文章。那么小编在网摘上汇集了一些关于“java贷款计算器””的相关文章,希望朋友们能喜欢,各位老铁们一起来了解一下吧!

规则引擎概述

一、什么是规则引擎

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

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

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

二、使用规则引擎的优势

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

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

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

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

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

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

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

三、规则引擎应用场景

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

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

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

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

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

四、Drools介绍

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

drools官网地址:

drools源码下载地址:

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

<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开发步骤如下:

Drools入门案例

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

一、业务场景说明

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

规则编号

规则名称

描述

1

规则一

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

2

规则二

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

3

规则三

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

4

规则四

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

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

二、开发实现

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

<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配置文件

<?xml version="1.0" encoding="UTF-8" ?><kmodule xmlns=";>  <!--br        name:指定kbase的名称,可以任意,但是需要唯一       packages:指定规则文件的目录,需要根据实际情况填写,否则无法加载到规则文件        default:指定当前kbase是否为默认br    -->      <kbase name="myKbase1" packages="rules" default="true">         <!--br            name:指定ksession名称,可以任意,但是需要唯一            default:指定当前session是否为默认br        -->         <ksession name="ksession-rule" default="true"/>      </kbase>  </kmodule>

注意:上面配置文件的名称和位置都是固定写法,不能更改

第三步:创建实体类Order

package com.itheima.drools.entity;/** * 订单 */public class Order {    //订单原始价格,即优惠前价格    private Double originalPrice;    //订单真实价格,即优惠后价格    private Double realPrice;        public String toString() {         return "Order{" +             "originalPrice=" + originalPrice +            ", realPrice=" + realPrice +           '}';    }     public Double getOriginalPrice() {       return originalPrice;   }   public void setOriginalPrice(Double originalPrice) {       this.originalPrice = originalPrice;   }   public Double getRealPrice() {       return realPrice;   }   public void setRealPrice(Double realPrice) {       this.realPrice = realPrice;br       }}

第四步:创建规则文件resources/rules/bookDiscount.drl

//图书优惠规则package book.discountimport com.itheima.drools.entity.Order//规则一:所购图书总价在100元以下的没有优惠brrule "book_discount_1"br    whenbr        $order:Order(originalPrice < 100)br    thenbr        $order.setRealPrice($order.getOriginalPrice());br        System.out.println("成功匹配到规则一:所购图书总价在100元以下的没有优惠");brendbrbr//规则二:所购图书总价在100到200元的优惠20元brrule "book_discount_2"br    whenbr        $order:Order(originalPrice < 200 && originalPrice >= 100)br    thenbr        $order.setRealPrice($order.getOriginalPrice() - 20);br        System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");brendbrbr//规则三:所购图书总价在200到300元的优惠50元brrule "book_discount_3"br    whenbr        $order:Order(originalPrice <= 300 && originalPrice >= 200)br    thenbr        $order.setRealPrice($order.getOriginalPrice() - 50);br        System.out.println("成功匹配到规则三:所购图书总价在200到300元的优惠50元");brendbrbr//规则四:所购图书总价在300元以上的优惠100元brrule "book_discount_4"br    whenbr        $order:Order(originalPrice >= 300)br    thenbr        $order.setRealPrice($order.getOriginalPrice() - 100);br        System.out.println("成功匹配到规则四:所购图书总价在300元以上的优惠100元");brend

第五步:编写单元测试

br@Testbrpublic void test1(){br    KieServices kieServices = KieServices.Factory.get();br    KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();br    //会话对象,用于和规则引擎交互br    KieSession kieSession = kieClasspathContainer.newKieSession();brbr    //构造订单对象,设置原始价格,由规则引擎根据优惠规则计算优惠后的价格br    Order order = new Order();br    order.setOriginalPrice(210D);brbr    //将数据提供给规则引擎,规则引擎会根据提供的数据进行规则匹配br    kieSession.insert(order);brbr    //激活规则引擎,如果规则匹配成功则执行规则br    kieSession.fireAllRules();br    //关闭会话br    kieSession.dispose();brbr    System.out.println("优惠前原始价格:" + order.getOriginalPrice() +br                       ",优惠后价格:" + order.getRealPrice());br}

通过上面的入门案例我们可以发现,使用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.insert(order)就是将order对象插入到了工作内存中。

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

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

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

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

Execution Engine:执行引擎,执行Agenda中被激活的规则。

3.规则引擎执行过程

4.KIE介绍

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

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

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

标签: #java贷款计算器