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 …...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
