JAVA:集成 Drools 业务规则引擎的技术指南
1、简述
Drools 是一个强大的业务规则引擎,适用于需要动态决策或规则管理的场景。它允许开发人员将业务逻辑与应用代码分离,使得业务人员可以通过规则文件维护和更新规则,而无需修改应用代码。本文将介绍 Drools 的基本概念、配置方式,并通过样例展示如何创建和使用规则。

2、核心特点
Drools 是一个基于 Java 的开源规则引擎,由 Red Hat 维护。它使用 DRL (Drools Rule Language) 规则文件定义业务逻辑,可以根据预设的规则推理和决策。Drools 特别适用于需要动态调整规则的系统,例如电商促销、保险费率计算、信用评分等。
在 Drools 中,以下是几个关键概念:
- 规则(Rule):条件与操作的组合。规则由 when 部分(条件)和 then 部分(操作)组成。
- Fact(事实):Drools 中的业务数据对象。Fact 是规则推理的依据。
- 规则引擎(Rule Engine):执行并管理规则的核心组件。
- 工作内存(Working Memory):存储事实的临时内存,规则引擎在其中执行推理。
3、集成
Drools 7.30.0 及以上的版本已经开始支持 JDK 11,但在使用 JDK 17 或更高版本时,Drools 8.x 版本更稳定。
3.1 Drools 配置
在项目中使用 Drools 需要引入依赖,常用的依赖包包括 drools-core 、drools-compiler 等。请确保依赖的是最新的 Drools 版本。在 Maven 项目中,可以在 pom.xml 文件中添加以下依赖:
<dependencies><!-- Drools 核心依赖 --><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>8.36.0.Final</version></dependency><!-- Drools 编译器 --><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>8.36.0.Final</version></dependency><!-- Drools 核心库 --><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>8.36.0.Final</version></dependency><!-- Drools MVEL 模块 --><dependency><groupId>org.drools</groupId><artifactId>drools-mvel</artifactId><version>8.36.0.Final</version></dependency>
</dependencies>
3.2 创建 Fact 类 Product
package com.example.model;public class Product {private String type;private int discount;public Product(String type) {this.type = type;}public String getType() {return type;}public void setType(String type) {this.type = type;}public int getDiscount() {return discount;}public void setDiscount(int discount) {this.discount = discount;}
}
3.3 配置 DroolsConfig
在 DroolsConfig 配置类中,我们可以使用 KieFileSystem 加载 resources/rules 目录下的 .drl 文件。
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import java.io.IOException;
import java.util.Arrays;@Configuration
public class DroolsConfig {private final ResourceLoader resourceLoader;public DroolsConfig(ResourceLoader resourceLoader) {this.resourceLoader = resourceLoader;}@Beanpublic KieContainer kieContainer() throws IOException {KieServices kieServices = KieServices.Factory.get();KieFileSystem kieFileSystem = kieServices.newKieFileSystem();// 使用 PathMatchingResourcePatternResolver 解析规则文件PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] ruleFiles = resolver.getResources("classpath*:rules/*.drl");// 将所有规则文件添加到 KieFileSystemArrays.stream(ruleFiles).forEach(ruleFile -> {try {kieFileSystem.write(ResourceFactory.newFileResource(ruleFile.getFile()));} catch (Exception e) {throw new RuntimeException("Error reading rule file: " + ruleFile, e);}});// 构建 KieModuleKieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);kieBuilder.buildAll();KieModule kieModule = kieBuilder.getKieModule();// 返回 KieContainerreturn kieServices.newKieContainer(kieModule.getReleaseId());}
}
3.4 示例规则文件
在 src/main/resources/rules 文件夹下创建示例 .drl 规则文件,例如 product.drl:
package rules;import com.example.model.Product;rule "Gold Product Discount"whenproduct : Product(type == "GOLD")thenproduct.setDiscount(20);System.out.println("Applying 20% discount for GOLD product");
endrule "Silver Product Discount"whenproduct : Product(type == "SILVER")thenproduct.setDiscount(10);System.out.println("Applying 10% discount for SILVER product");
end
3.5 创建使用规则的服务类
创建一个服务类来应用规则:
package com.example.service;import com.example.model.Product;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class DiscountService {private final KieContainer kieContainer;@Autowiredpublic DiscountService(KieContainer kieContainer) {this.kieContainer = kieContainer;}public void applyDiscount(Product product) {KieSession kieSession = kieContainer.newKieSession();kieSession.insert(product);kieSession.fireAllRules();kieSession.dispose();}
}
3.6 测试配置
创建一个测试类来运行并验证 Drools 配置是否正确:
package com.example;import com.example.model.Product;
import com.example.service.DiscountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class DroolsTestRunner implements CommandLineRunner {@Autowiredprivate DiscountService discountService;@Overridepublic void run(String... args) throws Exception {Product goldProduct = new Product("GOLD");discountService.applyDiscount(goldProduct);System.out.println("Gold product discount: " + goldProduct.getDiscount() + "%");Product silverProduct = new Product("SILVER");discountService.applyDiscount(silverProduct);System.out.println("Silver product discount: " + silverProduct.getDiscount() + "%");}
}
启动 Spring Boot 应用后,将输出如下,验证规则已成功应用:
Applying 20% discount for GOLD product
Gold product discount: 20%
Applying 10% discount for SILVER product
Silver product discount: 10%
4、使用场景
Drools 适用于多种场景,以下是一些常见的应用:
- 电商促销规则:根据产品类别、用户等级、订单金额等动态应用折扣和促销策略。
- 信用评分系统:根据用户的历史记录和交易行为生成信用评分。
- 保险费率计算:根据客户的年龄、性别、健康状况和保险类型计算保费。
- 风险检测:在金融或电商平台中,通过规则引擎检测欺诈行为。
5、总结
Drools 是一款灵活且功能强大的规则引擎,允许开发人员轻松管理复杂的业务规则。通过将业务逻辑封装在规则文件中,Drools 提供了便于维护和扩展的解决方案。希望本文对 Drools 的入门和使用有所帮助。
相关文章:
JAVA:集成 Drools 业务规则引擎的技术指南
1、简述 Drools 是一个强大的业务规则引擎,适用于需要动态决策或规则管理的场景。它允许开发人员将业务逻辑与应用代码分离,使得业务人员可以通过规则文件维护和更新规则,而无需修改应用代码。本文将介绍 Drools 的基本概念、配置方式&#…...
GeoHD - 一种用于智慧城市热点探测的Python工具箱
GeoHD - 一种用于智慧城市热点探测的Python工具箱 详细原理请参考:Yan, Y., Quan, W., Wang, H., 2024. A data‐driven adaptive geospatial hotspot detection approach in smart cities. Trans. GIS tgis.13137. 代码下载:下载 1. 简介 在城市数据…...
记一次Ngnix配置
记一次Ngnix配置 配置Ngnix配置防火墙 假设一个服务器中有一个公网IP、一个内网IP,另外已经部署好后台服务的接口地址为http://内网ip:8088。 配置Ngnix 找到Ngnix的配置文件,通过在Ngnix的安装路径下的 \conf\nginx.conf 文件。 worker_processes 1;…...
2024年国赛高教杯数学建模C题农作物的种植策略解题全过程文档及程序
2024年国赛高教杯数学建模 C题 农作物的种植策略 原题再现 根据乡村的实际情况,充分利用有限的耕地资源,因地制宜,发展有机种植产业,对乡村经济的可持续发展具有重要的现实意义。选择适宜的农作物,优化种植策略&…...
java基础语知识(8)
类之间的关系 在类之间,最常见的关系有: 依赖(“uses-a”);聚合(“has-a”);继承(“is-a”)。 依赖:一种使用关系,即一个类的实现需要另一个类的协助&#x…...
室内定位精度方案对比
室内定位精度方案对比:成本、开发难度与精度的权衡 索引 引言 Wi-Fi 定位方案 定位原理 成本分析 开发难度 定位精度 蓝牙定位方案 定位原理 成本分析 开发难度 定位精度 超宽带(UWB)定位方案 定位原理 成本分析 开发难度 定…...
Pytorch深度学习教程_5_编写第一个神经网络
欢迎来到《pytorch深度学习教程》系列的第五篇!在前面的四篇中,我们已经介绍了Python、numpy及pytorch的基本使用,并在上一个教程中介绍了梯度。今天,我们将探索神经网络,对于神经网络进行概述并进行简单的实践学习 欢…...
ImportError: cannot import name ‘FixtureDef‘ from ‘pytest‘
错误信息表明 pytest 在尝试导入 FixtureDef 时出现了问题。通常是由于 pytest 版本不兼容 或 插件版本冲突 引起的。以下是详细的排查步骤和解决方案: 1. 检查 pytest 版本 首先,确认当前安装的 pytest 版本。某些插件可能需要特定版本的 pytest 才能…...
改BUG:Mock测试的时候,when失效
问题再现: 这里我写了一测试用户注册接口的测试类,并通过when模拟下层的服务,但实际上when并没有奏效,还是走了真实的service层的逻辑。 package cn.ac.evo.review.test;import cn.ac.evo.review.user.UserMainApplication; imp…...
【自动化脚本工具】AutoHotkey (Windows)
目录 1. 介绍AutoHotkey2. 功能脚本集锦2.1 桌面键盘显示 1. 介绍AutoHotkey 支持Windows安装使用,下载地址为:https://www.autohotkey.com/ 2. 功能脚本集锦 2.1 桌面键盘显示 便于练习键盘盲打 脚本地址:https://blog.csdn.net/weixin_6…...
专题--Linux体系
Linux体系结构相关| ProcessOn免费在线作图,在线流程图,在线思维导图 ProcessOn是一个在线协作绘图平台,为用户提供强大、易用的作图工具!支持在线创作流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计、iOS界面原型设计等。同时…...
【DeepSeek】Mac m1电脑部署DeepSeek
一、电脑配置 个人电脑配置 二、安装ollama 简介:Ollama 是一个强大的开源框架,是一个为本地运行大型语言模型而设计的工具,它帮助用户快速在本地运行大模型,通过简单的安装指令,可以让用户执行一条命令就在本地运…...
Spring AI + Ollama 实现调用DeepSeek-R1模型API
一、前言 随着人工智能技术的飞速发展,大语言模型(LLM)在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型,凭借其强大的自然语言处理能力和丰富的知识储备,迅速成为业界关注的焦点。无论是文本生…...
如何在本地和服务器新建Redis用户和密码
文章目录 一. Redis安装二. 新建Redis用户,测试连接2.1 本地数据库2.2 线上数据库2.2.1 安装和配置2.2.2 测试连接 三. 配置四. 分布式 一. Redis安装 Redis安装 可以设置开机自动启动,也可以在去查看系统服务,按[win R],输入命…...
jmeter接口测试(一)
一、什么是接口测试?为什么要做接口测试? 接口测试:就是测试项目和项目之间,模块和模块之间,组件和组件之间的数据交互和权限鉴定(鉴权)。 前后端分离:前后端联调。mock模拟&#x…...
Java-11
淘天集团2025届春季校园招聘在线笔试-研发 1。设有一个顺序共享栈storageArray[70],其中栈X的栈顶指针top1的初值为-1,栈Y的栈顶指针top2的初值为70,通过不断进行入栈操作,直到storageArray数组已满,此时top1 top2 …...
js中常用方法整理
数据类型 typeOf()Number()parseInt()parseFloat()- * / %检测数据类型转换为数字转换为整数类型转换为浮点类型非加法的数字运算toString()Boolean()String()转换为字符串,不能转换undefined/null字符串拼接转换为布尔类型转换为字符串、所有…...
umi react+antd 判断渲染消息提示、input搜索、多选按钮组
记得map里返回的每层遍历结构都要带上key(图里没加,最近在接手react,熟悉中......
Day15-后端Web实战-登录认证——会话技术JWT令牌过滤器拦截器
目录 登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术 2.3 JWT令牌2.3.1 介绍2.3.2 生成和校…...
【嵌入式常用工具】Srecord使用
文件格式 -Intel 表示hex格式-Motorola 表示S19格式-BINary 表示bin格式 截取指定地址段 srec_cat input.s19 -Motorola -crop 0x80010000 0x80380000 -output output.s19 -Motorola -address-length4填充指定地址段 srec_cat input.s19 -Motorola -fill 0xFF 0x100 0x200 …...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
