Drools是目前比较流行的开源规则引擎,很多业务系统中都会用到它,特别是风控领域的系统,下面使用Drools7实现一个授信额度规则的简单示例
假设个人月收入与可授信额度规则关系如下:
月收入 | 可授信额度 |
---|---|
月收入[0.5-1)万 | 可授信2万 |
月收入[1-2)万 | 可授信5万 |
月收入[2-3)万 | 可授信10万 |
月收入[3-5)万 | 可授信30万 |
月收入[5-)万 | 可授信50万 |
引入Drools相关的jar包,包括kie-api
、drools-core
和drools-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>
定义一个借贷人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方法
}
在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
在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属性必须唯一。
在测试方法中创建两个借贷人信息,分别设置月收入为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引擎交互的会话
可见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]元