Drools7实现授信额度规则简单示例

一、示例内容介绍

Drools是目前比较流行的开源规则引擎,很多业务系统中都会用到它,特别是风控领域的系统,下面使用Drools7实现一个授信额度规则的简单示例
假设个人月收入与可授信额度规则关系如下:

月收入可授信额度
月收入[0.5-1)万可授信2万
月收入[1-2)万可授信5万
月收入[2-3)万可授信10万
月收入[3-5)万可授信30万
月收入[5-)万可授信50万

二、实现步骤

2.1、目录结构

项目整体目录结构如下
在这里插入图片描述

2.2、引入pom依赖

引入Drools相关的jar包,包括kie-apidrools-coredrools-compiler

		<dependency>
			<groupId>org.kie</groupId>
			<artifactId>kie-api</artifactId>
			<version>7.11.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.drools</groupId>
			<artifactId>drools-core</artifactId>
			<version>7.11.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.drools</groupId>
			<artifactId>drools-compiler</artifactId>
			<version>7.11.0.Final</version>
		</dependency>

2.3、实体类编写

定义一个借贷人Borrower实体类,包含姓名年龄月收入可授信额度字段

package com.example.droolsdemo.model;

import java.math.BigDecimal;

/**
 * @Author: pandofox
 * @Desctription: 借贷人
 * @Date: Created in 2020/7/5 15:20
 * @Version: 1.0
 */
public class Borrower {

    private String name; //姓名
    private int age; //年龄
    private BigDecimal income;  //月收入
    private BigDecimal creditLine;  //可授信额度

    //get、set方法
}

2.4、规则编写

在resources目录下,先创建对应目录,再新建testBorrower01.drl规则文件,并且将月收入与可授信额度规则关系配置好。

package com.bizRules;
import com.example.droolsdemo.model.Borrower
import java.math.BigDecimal;

// 根据月收入判断可授信额度
// 月收入[0.5-1)万,可授信2万
rule "testBorrower01-creditLine-2W"
agenda-group "testBorrower01"
    when
        $b:Borrower($b.getIncome() >= 5000.00 && $b.getIncome() <10000.00)
    then
        $b.setCreditLine(new BigDecimal(20000.00));
end

// 月收入[1-2)万,可授信5万
rule "testBorrower01-creditLine-5W"
agenda-group "testBorrower01"
    when
        $b:Borrower($b.getIncome() >= 10000.00 && $b.getIncome() <20000.00)
    then
        $b.setCreditLine(new BigDecimal(50000.00));
end

// 月收入[2-3)万,可授信10万
rule "testBorrower01-creditLine-10W"
agenda-group "testBorrower01"
    when
        $b:Borrower($b.getIncome() >= 20000.00 && $b.getIncome() <30000.00)
    then
        $b.setCreditLine(new BigDecimal(100000.00));
end

// 月收入[3-5)万,可授信30万
rule "testBorrower01-creditLine-30W"
agenda-group "testBorrower01"
    when
        $b:Borrower($b.getIncome() >= 30000.00 && $b.getIncome() <50000.00)
    then
        $b.setCreditLine(new BigDecimal(300000.00));
end

// 月收入[5-)万,可授信50万
rule "testBorrower01-creditLine-50W"
agenda-group "testBorrower01"
    when
        $b:Borrower($b.getIncome() >= 50000.00 )
    then
        $b.setCreditLine(new BigDecimal(500000.00));
end

drl文件写法和java类似,可以指定package,也可以通过import导入实体类。
语法格式如下:

rule “name“ --规则名称
  attributes --规则属性
   when
       LHS --Left Hand Side
   then 
       RHS -- Right Hand Side
end

2.5、kmodule配置

在resources目录下,先创建META-INF目录,再创建kmodule.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <kbase name="bizRules" packages="com.bizRules">
        <ksession name="testBorrower01-rules"/>
    </kbase>
</kmodule>

kmodule可包含一个或多个kbase;kbase可包含一个或多个ksession,name属性必须唯一;ksession的name属性必须唯一。

2.6、业务逻辑

在测试方法中创建两个借贷人信息,分别设置月收入为8千3万,调用规则引擎,并输出对应可授信额度(整体逻辑参考注释即可)

	@Test
	public void testBorrower01() {
		//初始化kie容器
		KieServices kieServices = KieServices.get();
		KieContainer kieContainer = kieServices.getKieClasspathContainer();

		//创建名为testBorrower01-rules的kie会话(其配置在kmodule.xml文件中)
		KieSession kieSession = kieContainer.newKieSession("testBorrower01-rules");

		//指定需要匹配的一组规则(testBorrower01),对应drl文件中的agenda-group属性
		kieSession.getAgenda().getAgendaGroup("testBorrower01").setFocus();

		//创建两个借贷人信息,月收入分别为8千和2万
		Borrower borrower1 = new Borrower();
		borrower1.setName("张三");
		borrower1.setIncome(new BigDecimal(8000.00));
		Borrower borrower2 = new Borrower();
		borrower2.setName("李四");
		borrower2.setIncome(new BigDecimal(30000.00));

		//将借贷人信息传入kie会话中
		kieSession.insert(borrower1);
		kieSession.insert(borrower2);

		//调用kie会话API与drools交互,执行规则
		int count = kieSession.fireAllRules();
		//关闭会话
		kieSession.dispose();

		//输出结果
		System.out.println("Fire " + count + " rule(s)!");
		System.out.println(borrower1.getName() + "可授信额度[" + borrower1.getCreditLine() + "]元");
		System.out.println(borrower2.getName() +"可授信额度[" + borrower2.getCreditLine() + "]元");

	}

主要API说明:
KieServices:可以获取 KieContainer,通过它来获取的各种对象来完成规则构建、管理和执行等操作
KieContainer: 可以获取KieBase,是一个KieBase 容器
KieBase:一个知识仓库,包含了若干的规则、流程、方法,其本身不包含运行时数据
KieSession:基于KieBase创建,与Drools引擎交互的会话

2.7、效果查看

可见8千月收入匹配到的可授信额度为2万2万月收入匹配到的可授信额度为30万

....
2020-07-05 16:56:03.146  INFO 19540 --- [           main] o.d.c.k.builder.impl.KieRepositoryImpl   : KieModule was added: FileKieModule[releaseId=com.example:droolsdemo:0.0.1-SNAPSHOT,file=D:\3.dev\ideaworkspace\droolsdemo\droolsdemo\target\classes]
Fire 2 rule(s)!
张三可授信额度[20000]元
李四可授信额度[300000]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值