Spring Boot 中使用 Drools 规则引擎的完整步骤
规则引擎作用
规则引擎主要用于将业务逻辑从应用程序代码中分离出来,提高系统的灵活性和可维护性。规则引擎通过预定义的规则来处理输入数据并做出相应的决策,从而实现业务逻辑的自动化和动态调整。
例如
门店信息校验:美团点评在门店信息校验过程中使用规则引擎,对门店信息进行质量控制。规则包括分支条件、简单计算规则和业务定制计算规则等。通过规则引擎,门店信息校验过程变得更加高效和准确。 业务场景说明
不同会员的折扣率不同
代码结构
集成 drools(即规则引擎)到 spring boot 可以帮助你实现业务规则的动态管理和执行。下面我来简要说明一下业务场景和代码实现的步骤:
1. 添加依赖
首先,需要在 pom.xml 文件中添加 drools 的依赖:
org.drools
drools-compiler
7.6.0.final
2. 创建规则文件
在项目的src/main/resources目录下创建一个名为rules的文件夹,并在其中创建一个名为sample.drl的规则文件:
package com.song;
import com.song.rulesobj.customer
rule "ordinary-customers"
when
customer: customer(type == "ordinary")
then
customer.setdiscount(0.9*customer.getoriginalprice()); // 9折 普通会员
end
rule "vip-customers"
when
customer: customer(type == "vip")
then
customer.setdiscount(0.6*customer.getoriginalprice()); // 6折 vip会员
end
rule "svip-customers"
when
customer: customer(type == "svip")
then
customer.setdiscount(0.4*customer.getoriginalprice()); // 4折 svip会员
end
3. 定义实体类
创建一个简单的实体类 customer,用于表示客户信息:
package com.song.rulesobj;
import lombok.data;
@data
public class customer {
/**
* 客户类型
*/
private string type;
/**
* 客户订单价格
*/
private double originalprice; // 订单原始价格,即优惠前的价格
/**
* 优惠后最终结算价格
*/
private double discount;
}
4. 配置 drools 规则引擎
在 spring boot 应用程序中配置 drools 规则引擎的 bean:
package com.song.conf;
import com.song.bean.discountbean;
import org.kie.api.kieservices;
import org.kie.api.builder.kiebuilder;
import org.kie.api.builder.kiefilesystem;
import org.kie.api.builder.kierepository;
import org.kie.api.runtime.kiecontainer;
import org.kie.api.runtime.kiesession;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
@configuration
public class droolsconfig {
@bean
public kiecontainer kiecontainer() {
kieservices kieservices = kieservices.factory.get();
kierepository kierepository = kieservices.getrepository();
kiefilesystem kiefilesystem = kieservices.newkiefilesystem();
kiefilesystem.write(kieservices.getresources().newclasspathresource("rules/sample.drl"));
kiebuilder kiebuilder = kieservices.newkiebuilder(kiefilesystem);
kiebuilder.buildall();
return kieservices.newkiecontainer(kierepository.getdefaultreleaseid());
}
@bean
public kiesession kiesession() {
return kiecontainer().newkiesession();
}
@bean
public discountbean discountbean() {
return new discountbean(kiesession());
}
}
5. 应用规则引擎
在业务代码中使用注入的 kiesession 执行规则:
/*******************************************************************************
* package: com.song.bean
* type: discountservice
* date: 2024-06-28 13:45
*
* copyright (c) 2024 ltd all rights reserved.
*
* you may not use this file except in compliance with the license.
*******************************************************************************/
package com.song.bean;
import com.song.rulesobj.customer;
import org.kie.api.runtime.kiesession;
/**
* 功能描述: 规则处理器封装
*
* @author songxianyang
* @date 2024-06-28 13:45
*/
public class discountbean {
private kiesession kiesession;
public discountbean(kiesession kiesession) {
this.kiesession = kiesession;
}
public void applydiscount(customer customer) {
kiesession.insert(customer); // 插入客户对象到规则引擎中
kiesession.fireallrules(); // 执行规则
// 客户对象已经被更新,包含了计算出的折扣
system.out.println("客户订单价格"+customer.getoriginalprice()+"客户折扣类型: " + customer.gettype() + ", 优惠后最终结算价格: " + customer.getdiscount());
}
}
6. 测试规则引擎
编写一个简单的测试类来验证规则引擎是否按预期工作:
package com.song.web;
import com.song.bean.discountbean;
import com.song.common.annotation.responseinfoskin;
import com.song.rulesobj.customer;
import io.swagger.annotations.api;
import io.swagger.annotations.apioperation;
import org.kie.api.runtime.kiecontainer;
import org.kie.api.runtime.kiesession;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.postmapping;
import org.springframework.web.bind.annotation.requestbody;
import org.springframework.web.bind.annotation.restcontroller;
@restcontroller
@api(tags = "规则引擎")
@responseinfoskin
public class democontroller {
@autowired
private discountbean discountbean;
@postmapping("/discount")
@apioperation("打折")
public double discount(@requestbody customer customer) {
// 规则处理器封装
discountbean.applydiscount(customer);
return customer.getdiscount();
}
}
测试截图
总结
通过上述步骤,你可以将 drools 规则引擎集成到 spring boot 应用程序中,并使用规则文件动态管理业务规则,实现不同客户类型的动态折扣计算。这种方式可以使得业务规则更易于维护和修改,同时与应用程序解耦,提高了灵活性和可维护性。
源码
到此这篇关于spring boot 中使用 drools 规则引擎的完整指南的文章就介绍到这了,更多相关spring boot drools 规则引擎内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
推荐阅读
-
IDEA中使用Gradle构建项目中文报GBK错误的解决方案
-
将Java应用做成exe可执行软件的流程步骤
-
SpringBoot实现多种来源的Zip多层目录打包下载
需要将一批文件(可能分布在不同目录、不同来源)打包成zip格式,按目录结构导出给用户下载。1.核心思路支持将本地服务器上的文...
-
Java中减少if-else的设计模式和优化技巧
前言“过于依赖if-else不仅会让代码变得臃肿不堪,还会使维护成本大大增加。其实,if-else虽然是最基础的条件分支,...
-
Spring Boot整合Drools规则引擎实战指南及最佳实践
一、drools简介与核心概念1.1什么是drools?drools是redhat旗下的开源业务规则管理系统(brms),...
-
Springboot项目瘦身之如何将jar包与lib依赖分开打包
将jar包与lib依赖分开打包方法一:项目和依赖完全分离maven-jar-plugin负责生成jar文件(jar文件中...
-
Spring动态修改bean属性配置key的几种方法
静态配置的局限性先来看一个典型场景。假设我们有一个数据源配置类:@configuration@configurationpr...
-
Java如何判断一个IP是否在给定的网段内
-
从零开始学java之二叉树和哈希表实现代码
-
Java如何解决ArrayList的并发问题
arraylist是java.util包中的一个类,它不是线程安全的。如果多个线程同时对同一个arraylist进行操作,可能会...




