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 …...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
