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

本文介绍了如何在Springboot项目中集成Drools规则引擎,通过创建kmodule.xml配置文件,定义规则并编写DRL文件来根据用户的征信等级自动计算贷款额度。同时,文章提到了Drools的活跃社区支持和易用性等优点。
简介:

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值