简介:
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插件
3.模拟场景
模拟:根据用户征信等级评定用户贷款额度,当然,现实中额度测算肯定会比这种情况复查的多。
征信等级:
- 等级0:额度0,
- 等级1:额度10w,
- 等级2:额度5w,
- 等级3:额度3w。
- 其余:额度1.5w
4.创建kmodule.xml文件
maven项目目录下创建 resources/META-INF/kmodule.xml(文件名称一定要对)
- 一个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指定的位置)
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("规则执行完成,关闭规则");
}
}
控制台输出