前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Drools】值得打工人学习的规则引擎Drools<一>

【Drools】值得打工人学习的规则引擎Drools<一>

作者头像
沁溪源
发布2020-11-13 14:38:56
7.7K0
发布2020-11-13 14:38:56
举报
文章被收录于专栏:沁溪源沁溪源

本文主要对Drools的使用业务场景做简单介绍。

规则引擎

规则引擎:全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。 需要注意的是规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务规则管理系统。 目前市面上具体的规则引擎产品有:drools、VisualRules、iLog等。 规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。规则引擎其实就是一个输入输出平台。

Drools介绍

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

  • 使用规则引擎能够解决什么问题? 针对复杂的业务规则代码处理,往往存在一下问题: 1、硬编码实现业务规则难以维护; 2、硬编码实现业务规则难以应对变化; 3、业务规则发生变化需要修改代码,重启服务后才能生效; 于是规则引擎Drools便诞生在项目中。。。
  • 使用规则引擎的优势如下: 1、业务规则与系统代码分离,实现业务规则的集中管理 2、在不重启服务的情况下可随时对业务规则进行扩展和维护 3、可以动态修改业务规则,从而快速响应需求变更 4、规则引擎是相对独立的,只关心业务规则,使得业务分析人员也可以参与编辑、维护系统的业务规则 5、减少了硬编码业务规则的成本和风险 6、使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单

构成

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

  • Working Memory:工作内存,drools规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,所以我们开发的应用程序只需要将我们的数据插入到Working Memory中即可;
  • Rule Base:规则库,我们在规则文件中定义的规则都会被加载到规则库
  • Inference Engine:推理引擎 其中Inference Engine(推理引擎)又包括:
  1. Pattern Matcher(匹配器): 具体匹配哪一个规则,由这个完成,将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入Agenda中。
  2. Agenda(议程):用于存放通过匹配器进行模式匹配后被激活的规则。
  3. Execution Engine(执行引擎):执行Agenda中被激活的规则。
代码语言:javascript
复制
Fact:事实,是指在drools 规则应用当中,**将一个普通的JavaBean插入到Working Memory后的对象就是Fact对象**,Fact对象是我们的应用和规则引擎进行数据交互的桥梁或通道。

规则引擎执行过程

在这里插入图片描述
在这里插入图片描述
  • 规则引擎应用场景 对于一些存在比较复杂的业务规则并且业务规则会频繁变动的系统比较适合使用规则引擎,如下: 1、风险控制系统----风险贷款、风险评估 2、反欺诈项目----银行贷款、征信验证 3、决策平台系统----财务计算 4、促销平台系统----满减、打折、加价购

实战

目录结构:

在这里插入图片描述
在这里插入图片描述
  • pom.xml中引入依赖drools
代码语言:javascript
复制
注意这里在properties标签中设置版本
 <properties>
        <java.version>1.8</java.version>
        <drools.version>7.28.0.Final</drools.version>
    </properties>

        <!-- start drools -->
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>${drools.version}</version>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>${drools.version}</version>
        </dependency>

        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <version>${drools.version}</version>
        </dependency>

        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-internal</artifactId>
            <version>${drools.version}</version>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>${drools.version}</version>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-decisiontables</artifactId>
            <version>7.35.0.Final</version>
        </dependency>
        <!--  end drools   -->
  • src/main/resources/META-INF目录下新建文件kmodule.xml
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://www.drools.org/xsd/kmodule">
    <!--
       可以存在多个<kbase>标签;
       name属性值可以随意设置;
       packages:对应*.drl文件的resources路径

       ksession标签必须设置;一个或者多个标签,name属性值唯一

       -->
    <kbase name="test-rulesKB" packages="rules">
        <ksession name="test-rulesKS"/>
    </kbase>

</kmodule>
  • 在src/main/resources/rules目录下新建test.drl文件
代码语言:javascript
复制
package rules
import com.qxy.drools.Customer

rule "customerAge"
no-loop true // 定义当前的规则是否 不允许多次循环执行,默认是 false,也就是当前的规则只要满足条件,可以无限次执行
lock-on-active true //将lock-on-active属性的值设置为true,可避免因某些Fact对象被修改而使已经执行过的规则再次被激活执行。
salience 1
when
$customer:Customer(age < 10)
then
$customer.setAge($customer.getAge() + 1);
update($customer)
System.out.println($customer.getName() + ",age:" + $customer.getAge());
end
  • 运行测试
代码语言:javascript
复制
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

/**
 * @author qxy
 * @date 2020/11/11 11:31 上午
 */
public class DroolTest {
    public static void main(String[] args) {
        KieServices ks = KieServices.Factory.get();
        KieContainer kc = ks.getKieClasspathContainer();
        KieSession ksession = kc.newKieSession("test-rulesKS");
        Customer customer1 = new Customer();
        customer1.setAge(1);
        customer1.setName("李三");
        Customer customer2 = new Customer();
        customer2.setAge(18);
        customer2.setName("李四");

        ksession.insert(customer1);
        ksession.insert(customer2);
        ksession.fireAllRules();
        ksession.dispose();
    }
 }

整理的这份超全Java面试题包含: Java基础、Java异常、Spring、SpirngMVC、MyBatis、SpringBoot、SpringCloud、BIO、NIO、AIO、Netty、Tomcat、Redis、MySQL、Memcache、ElasticSearch、zookeeper、RabbitMQ、Vue、Dubbo、并发编程、Java虚拟机、TCP、Http、大数据、设计模式、Linux等

公众号Java专栏,后台回复【面试66】。即可获取! 或者点击下方超链接: 史上最全Java面试题,41个方向!一网打尽!

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 规则引擎
  • Drools介绍
  • 构成
  • 实战
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档