Drools基础与实现(操作实例)

news2024/11/20 8:38:50

简介:

Drools 是用 Java 语言编写的开放源码规则引擎,使用 Rete 算法对所编写的规则求值。Drools 允许使用声明方式表达业务逻辑。可以使用非 XML 的本地语言编写规则,从而便于学习和理解。并且,还可以将 Java 代码直接嵌入到规则文件中,这令 Drools 的学习更加吸引人。

Drools 还具有其他优点:

  • 非常活跃的社区支持
  • 易用
  • 快速的执行速度
  • 在 Java 开发人员中流行
  • 与 Java Rule Engine API(JSR 94)兼容

1.创建Springboot项目,添加依赖

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 规则引擎 -->
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>6.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>6.5.0.Final</version>
            <scope>runtime</scope>

        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>

2.idea安装drools插件

image-20230103003134366

3.模拟场景

模拟:根据用户征信等级评定用户贷款额度,当然,现实中额度测算肯定会比这种情况复查的多。

征信等级:

  • 等级0:额度0,
  • 等级1:额度10w,
  • 等级2:额度5w,
  • 等级3:额度3w。
  • 其余:额度1.5w

4.创建kmodule.xml文件

maven项目目录下创建 resources/META-INF/kmodule.xml(文件名称一定要对)image-20230103003406470

  • 一个kmodle可以对应多个kbase,name可任意,但需唯一
  • 一个kbase可以对应多个ksession,name可任意,但需唯一
  • kbase中的packages应对应resource目录下,存放规则文件的名称
  • 该xml文件格式、名称是固定的。
<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">

    <!--
    (一个kmodle可以对应多个kbase,但是kbase需要唯一的name-)
    name:指定kbase的名称,可以任意,但是必须唯一
    packages:指定规则文件的目录,需要根据实际情况填写,否则无法加载到规则文件
    default:指定当前kbase是否为默认
    packages为drl文件所在resource目录下的路径。注意分区drl文件中的package与此处的package不一定相同。多个包用逗号分隔,默认情况下会扫描resources目录下的所有(包含子目录)规则文件。
    -->
    <kbase name="SimpleRuleKBase" packages="rules">
        <!--
        name:指定ksession的名称,可以任意,但是必须唯一
        default:指定当前ksession是否为默认
        一个kbase中也可以对应多个kseesion,但是name必须唯一
        -->
        <ksession name="simpleRuleKSession"/>
    </kbase>

</kmodule>

5.创建实体类

package com.jhq.droolsdemo.bean;

import lombok.Data;

/**
 * 贷款额度对象
 */
@Data
public class Loans {


    /**
     * 征信等级:等级0:额度0,等级1:额度10w,等级2:额度5w,等级3:额度3w。其余:额度1.5w
     */
    private Integer creditGrade;


    /**
     * 额度
     */
    private Integer amount;
}

6.创建规则文件

在resource目录下创建rules文件,文件中放置规则文件(这个rules就是kbase中pages指定的位置)image-20230103004344626

import com.jhq.droolsdemo.bean.Loans

//征信等级:等级0:额度0,等级1:额度10w,等级2:额度5w,等级3:额度3w。其余:额度1.5w

  //征信等级0
  rule "credit_0" //名称需唯一
  when
  $loans:Loans(creditGrade == 0)
  then
  $loans.setAmount(0);
     System.out.println("触发规则,征信等级为0,额度0");
  end


  //征信等级1
  rule "credit_1" //名称需唯一
  when
  $loans:Loans(creditGrade == 1)
  then
  $loans.setAmount(100000);
  System.out.println("触发规则,征信等级为1,额度100000");
  end

  //征信等级2
  rule "credit_2" //名称需唯一
  when
  $loans:Loans(creditGrade == 2)
  then
  $loans.setAmount(50000);
       System.out.println("触发规则,征信等级为2,额度50000");
  end

      //征信等级3
   rule "credit_3" //名称需唯一
   when
   $loans:Loans(creditGrade == 3)
   then
   $loans.setAmount(30000);
           System.out.println("触发规则,征信等级为1,额度30000");
   end

  //征信等级 其他
  rule "credit_4" //名称需唯一
  when
  $loans:Loans(creditGrade>3)
  then
  $loans.setAmount(15000);
  System.out.println("触发规则,征信等级为:其他,额度15000");
  end


7.编写测试用例

package com.jhq.droolsdemo.controller;

import com.jhq.droolsdemo.bean.Loans;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class TestCreditController {


    @Test
    public void test() {
        //获取kieserver
        KieServices kieServices = KieServices.Factory.get();
        //获取kie容器,kmodule.xml文件中,kieBase指定的name(可以不指定)
        KieContainer kieContainer = kieServices.newKieClasspathContainer("SimpleRuleKBase");
        //获取kiesession,kmoudle.xml文件中kieSeeeion属性name(可以不指定)
        KieSession kieSession = kieContainer.newKieSession("simpleRuleKSession");
        //事实对象
        Loans loans = new Loans();
        //设置征信登记为1
        loans.setCreditGrade(1);
        //插入事实对象到session中
        kieSession.insert(loans);
        //执行规则引擎
        kieSession.fireAllRules();
        System.out.println("对象信息:" + loans.toString());
        kieSession.dispose();
        System.out.println("规则执行完成,关闭规则");


    }
}

控制台输出

image-20230103004520437

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逻辑漏洞渗透与攻防(一)之身份验证漏洞

目录 逻辑漏洞概要 漏洞的根因&#xff1a; 逻辑漏洞的分类&#xff1a; 身份验证漏洞 暴力破解漏洞 1.1 未限制爆破 1.2 爆破-验证码爆破 1.3 暴力破解漏洞-限制IP爆破 1.4 暴力破解漏洞-限制密码错误次数来爆破 1.5 暴力破解漏洞-多字段爆破 1.6 限制登录频率爆破 …

(小程序)会议OA项目-其它页面

目录 一、tabs组件及会议管理布局 1.自定义tabs组件 2.会议管理 二、投票管理参考图 三、个人中心布局 一、tabs组件及会议管理布局 1.自定义tabs组件 文档参考:自定义组件 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/framewo…

植物大战僵尸:实现自动收集阳光

植物大战僵尸这款游戏可以说是很多90后的回忆了&#xff0c;基本上只要是90后或多或少的都接触过&#xff0c;而玩游戏与制作辅助是两个概念&#xff0c;今天我将给大家分享一些游戏辅助方面的制作技巧&#xff0c;之所以使用植物大战僵尸这款游戏是因为游戏简单容易分析&#…

Apache Kafka Spring 集成

Apache Kafka Spring 集成 今天来学习Spring如何集成 Apache kafka&#xff0c;在Spring Boot中如何集成kafka客户端 生产、消费消息。首先介绍下各个组件的版本信息&#xff1a; Apache Kafka_2.13-3.3.1Spring Boot 3.0.0Apache-Maven-3.6.0JDK-17.0.5 启动Kafka # 进入k…

ArcGIS基础实验操作100例--实验38删除冗余节点

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验38 删除冗余节点 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

免费分享在线设计工具,比ps还方便的贺卡设计工具!

元旦贺卡在线制作工具&#xff0c;不用自己设计&#xff0c;只需借助在线工具平台的模板就能轻松搞定的贺卡设计方法&#xff01;跟着小编下面的设计步骤&#xff0c;使用在线工具乔拓云轻松设计活动贺卡&#xff0c;设计过程简单且一键生成分享链接&#xff0c;不用自己设计工…

推荐四款常见的电子教室软件,大家觉得哪款好用

现在越来越多的教学教室都在使用多媒体教学软件&#xff0c;不仅包括学校&#xff0c;还有一些培训机构和教堂。 那么&#xff0c;多媒体教学软件有哪些&#xff1f; 哪款多媒体教学软件好用&#xff1f; 在今天的文章中&#xff0c;小编挑选了4款流行的多媒体教学软件推荐给大…

【全网最细PAT题解】【PAT乙】1009 说反话(cin、getline、cin.getline三种输入格式)

题目链接 1009 说反话 题目描述 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词…

【Spring 入门教程2】

&#x1f308;博客主页&#xff1a;屠一乐的博客 &#x1f4c5; 发文时间&#xff1a;2023.1.2 &#x1f388; 一定存在只有你才能做成的事 &#x1f339; 博主水平有限&#xff0c;如有错误&#xff0c;欢迎指正 欢迎各位&#x1f44d;收藏&#x1f48e;评论✉ Spring_day02 S…

C++ - opencv应用实例之矩形框检测

C++ - opencv应用实例之矩形框检测 现阶段下,目标检测在实际应用场景中的表现颇为重要,工业质检、移动机器人视觉伺服、作业、交通监控、安防领域等均需要通过目标检测来实现对目标的定位、测量或者统计、辅助控制等目前目标检测主要分为两个方向的发展,其一是基于传统图像处…

let、const、var关键字

1、let ES6中新增的用于声明变量的关键字。 &#xff08;1&#xff09;let声明的变量只在所处于的块级有效 if (true) { let a 10;} console.log(a) // a is not defined 注意&#xff1a;使用let关键字声明的变量才具有块级作用域&#xff0c;使用var声明的变量不具备块级…

计算机网络(二)Linux网络编程

layout: post title: 计算机网络&#xff08;二&#xff09;Linux网络编程 description: 计算机网络&#xff08;二&#xff09;Linux网络编程 tag: 计算机网络 文章目录POSIX概念POSIX网络相关APIsocket()bind()网络字节序与主机字节序&#xff08;大小端设备&#xff09;list…

TensorFlow之过拟合与欠拟合-2

1 基本概念 过度拟合&#xff08;overfit&#xff09; 正则化&#xff08;regularization&#xff09; L1正则化&#xff08;L1 regularization&#xff09; L2正则化&#xff08;L2 regularization&#xff09; 删除正则化&#xff08;dropout regularization&#xff09…

植物大战僵尸:实现灵魂收割者

植物大战僵尸这款游戏可以说是很多90后的回忆了&#xff0c;基本上只要是90后或多或少的都接触过&#xff0c;而玩游戏与制作辅助是两个概念&#xff0c;今天我将给大家分享一些游戏辅助方面的制作技巧&#xff0c;之所以使用植物大战僵尸这款游戏是因为游戏简单容易分析&#…

【JavaSE成神之路】聊聊封装这件事

哈喽&#xff0c;我是兔哥呀&#xff0c;今天就让我们继续这个JavaSE成神之路&#xff01; 这一节啊&#xff0c;咱们要学习的内容是Java的封装。 1. 什么是封装 Java的封装是指&#xff0c;在一个类中把一些重要的信息隐藏起来&#xff0c;使得外部不能直接访问。 Java的封…

Java --- JUC之volatile

目录 一、volatile两大特点 二、volatile的内存语义 三、volatile内存屏障 四、volatile四大屏障 五、volatile的特性 六、volatile使用场景 一、volatile两大特点 1、可见性 2、有序性 二、volatile的内存语义 1、当写一个volatile变量时&#xff0c;JMM会把该线程对…

C语言入门系列 - 共用体union,枚举enum,宏定义#define,条件编译,const与指针

C语言入门系列 - 共用体union,枚举enum&#xff0c;宏定义#define,条件编译,const与指针 第一节 C 语言基础以及基本数据类型 第二节 C 语言运算符 第三节 C 语言控制语句 第四节 C 语言自定义函数 第五节 C 语言修饰变量的关键字 第六节 C 语言构造数据类型–数组 第七节 C 语…

创建型模式

创建型模式 创建型模式对类的实例化过程进行了抽象&#xff0c;能够将软件中对象的创建和使用分离&#xff0c;使整个系统的设计更加符合单一职责原则。 什么是对象的创建与对象的使用分离&#xff1f; 一个女生想吃苹果&#xff0c;怎么办&#xff1f; 对象的创建和对象的使用…

TC275——04Blinky-LED

项目工程框架 项目驱动文件这个见过&#xff0c;三个main文件真的是开了眼&#xff0c;一个main代表一个核吗&#xff1f; 按照以往对实现LED闪烁的流程&#xff0c;一般是先配置时钟、再配置IO、延时&#xff0c;实现反转效果。 Blinky_LED.c 在驱动文件里&#xff1a; /*…

数据分析 -Hive学习 Day5

HIVE 核心技能之窗口函数 大家好呀&#xff0c;这节课我们学习 Hive 核心技能中最难的部分——窗口函数。窗口函数我们之前在学 MySQL 的时候有学过一些&#xff0c;但是只学了三个排序的窗口函数。这节课我们会学习更多的窗口函数&#xff0c;包括累计计算、分区排序、切片排…