深入浅出 Drools 规则引擎

目录

一、规则引擎简介

        1.1 应用场景

        1.2 Drools 规则引擎的特点

二、规则引擎集成

三、核心概念

        3.1 规则文件的组成

        3.2 模式匹配

        3.2 规则属性


一、规则引擎简介

        规则引擎是一种软件系统组件,设计目的是将业务决策逻辑从应用程序的主流程中解耦出来,使得业务规则可以独立于应用程序代码进行管理和变更。这种机制极大地提高了业务灵活性和可维护性,尤其是在那些业务规则频繁变动或者十分复杂的环境中。

        本文将介绍 Drools 的基本概念和简单引用,让你能快速上手使用 Drools 规则引擎。

        1.1 应用场景

        规则引擎的应用领域十分广泛,比如如下应用场景

  1. 决策支持系统:在金融、保险、医疗等行业中,Drools 可用于构建复杂的决策流程,比如金融行业的风控反欺诈系统、信贷审批、催收分案、支付路由等有广泛的使用
  2. 动态配置与策略管理:电信、电子商务等领域中,可以根据用户行为、市场条件等动态调整服务策略或营销活动规则。
  3. 合规性检查:在银行业、证券业和其他监管严格的行业,Drools 可用来实时验证交易是否符合法规要求。
  4. 物联网(IoT)智能决策:在处理大量传感器数据时,可以利用 Drools 实现基于规则的数据分析和实时决策响应。

        1.2 Drools 规则引擎的特点

  1. 业务与代码分离:Drools 支持业务专家使用自然语言式的规则描述,将业务逻辑从程序代码中抽离出来,便于业务人员维护和更新规则。
  2. 声明式编程:通过规则文件定义业务逻辑,而非传统的命令式编程,更加直观且易于理解。
  3. 复杂事件处理(CEP):能够对连续发生的事件流进行实时分析,触发相应的规则动作。
  4. 推理能力:支持Rete算法优化规则匹配,对于大规模规则集也能保证高效的推理执行。
  5. 可扩展性:Drools 不仅是一个规则引擎,还提供了完整的规则生命周期管理,包括规则的创建、存储、测试、部署和监控等功能。
  6. 集成性:Drools 可以无缝集成到Java应用程序中,并与其他企业级框架和技术良好兼容。

二、规则引擎集成

        下面以电商满减为例,演示下如何集成 Drools。

        首先是添加依赖

// 这里只添加 Drools 相关依赖,其他依赖请自行添加
<dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>${drools.version}</version><exclusions><exclusion><artifactId>poi-ooxml</artifactId><groupId>org.apache.poi</groupId></exclusion><exclusion><artifactId>poi</artifactId><groupId>org.apache.poi</groupId></exclusion></exclusions></dependency><dependency><groupId>org.jbpm</groupId><artifactId>jbpm-test</artifactId><version>${drools.version}</version></dependency>

        第二步,配置 Drools 配置类

@Configuration
public class DroolsConfig {// 规则文件路径private static final String RULE_PATH = "rules/test.drl";@Beanpublic KieContainer kieContainer() {// 设置日期格式System.setProperty("drools.dateformat", "yyyy-MM-dd HH:mm:ss");KieServices kieServices = KieServices.Factory.get();KieFileSystem kieFileSystem = kieServices.newKieFileSystem();// 将规则添加到 KieFileSystem 中kieFileSystem.write(ResourceFactory.newClassPathResource(RULE_PATH));// 构建 kieBuilder 编译规则KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);kieBuilder.buildAll();Results results = kieBuilder.getResults();if (results.hasMessages(Message.Level.ERROR)) {throw new IllegalStateException(">>> Error Messages:\n" + results.getMessages());}// 获取KieModuleKieModule kieModule = kieBuilder.getKieModule();// 创建KieContainer,装载模块return kieServices.newKieContainer(kieModule.getReleaseId());}
}

        第三步,在 resources 下添加规则文件

package com.order.rulesimport com.scf.drools.model.Order// 规则文件中函数定义
function boolean orderIsNull(Order order) {// 规则中通过 eval 来调用函数return order == null;
}// 规则的默认执行顺序是从上向下执行,可以通过 salience 指定执行顺序// 规则一:消费金额 100-200 优惠10元
rule "order_1"date-effective "2024-04-02 00:00:00" // 生效时间date-expires "2024-04-03 23:59:59"  // 失效时间when$order: Order(originalPrice >= 100 && originalPrice < 200)then$order.setRealPrice($order.getOriginalPrice() - 10);// 执行update后,会重新插入到工作内充中匹配其他规则// update($order)end// 规则二:消费金额 200-300 优惠20元
rule "order_2"when$order: Order(originalPrice >= 200 && originalPrice < 300)then$order.setRealPrice($order.getOriginalPrice() - 20);update($order)end// 规则三:消费金额 300-400 优惠30元
rule "order_3"when$order: Order(originalPrice >= 300 && originalPrice < 400)then$order.setRealPrice($order.getOriginalPrice() - 30);update($order)end

                第四步,根据插入的 fact 运行相应的规则

package com.scf.drools.service;import com.scf.drools.model.Order;
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 RuleEngineService {@Autowiredprivate KieContainer kieContainer;public void execute(Order fact) {KieSession kieSession = kieContainer.newKieSession();try {kieSession.insert(fact);kieSession.fireAllRules();} finally {kieSession.dispose();}}
}

        当方法被调用时,就会自动取匹配规则,并执行相应的代码,如果没有规则引擎,大概率是写一堆的 if else 来判断不同的业务逻辑,当然这个例子不叫简单,如果业务非常复杂,试想你将写出什么样的 if else 代码。

三、核心概念

        3.1 规则文件的组成

package ....import ....rule "ruleName"attributeswhenLHSthenRHS
end

        规则文件由以下几部分组成

  • package:包名,逻辑单位,同一个包下查询或者函数可以直接调用
  • import:用于导入类或静态方法
  • global:全局变量
  • function:自定义函数
  • query:定义一个查询语句,这个查询语句不会像规则那样自动触发,而是供您在应用程序中主动调用,用于检索满足特定条件的事实对象集合
  • rule end:规则体,规则体语法中包含的内容如下:
    • rule:关键字,标识开始,参数为唯一的规则名称
    • attrbutes:规则属性,为可选项,包括 date-effective
    • LHS:规则条件部分,只有规则条件成立才会进入到 RHS
    • RHS:规则的后果或行动部分,条件成立后,在这部分做相应的操作
    • end:关键字,标识一个规则的结束

        3.2 模式匹配

        匹配器可以将 rule base 中所有规则与 working memory 中的 fact 对象进行模式匹配,我们需要在 LHS 不分定义规则并进行模式匹配。LHS 不分由一个或多个条件组成,条件称为 pattern。

        pattern 的语法结构为:绑定的变量名:Object(filed约束)。比如 $order : Order(originalPrice >= 100),在 LHS 中比较符有下面这些:

符号

说明

>

大于

<

小于

>=

大于等于

<=

小于等于

==

等于

!=

不等于

contains

检查一个fact对象的某个属性值是否包含一个执行的对象值

not contains

检查一个fact对象的某个属性值是否不包含一个执行的对象值

member of

判断一个fact对象的某个属性是否存在一个或多个集合中

not member of

判断一个fact对象的某个属性是否不在一个或多个集合中

matchers

判断一个fact对象的属性是否与提供的标准的java正则表达式进行匹配

not matchers

判断一个fact对象的属性是否不与提供的标准的java正则表达式进行匹配

        3.2 规则属性

        Drools 规则引擎中的规则可以包含多种属性以控制规则的行为、执行顺序以及与其他规则的关系。以下是一些常用的规则属性及其用途: 

属性名

说明

salience

指定规则执行顺序,默认顺序是规则书写顺序

dialect

指定规则语言的类型,一种是java一种是mvel

enable

规则是否启动

date-effective

指定规则生效时间

date-expires

指定规则失效时间

activation-group

激活分组,具有相同分组名称的规则只能有一个规则触发

agenda-group

议程分组,只有获取焦点的组中的规则才有可能触发,组内规则不互斥

timer

定时器,指定规则触发时间

auto-focus

自动获取焦点,一般结合agenda-group一起使用

no-loop

防止死循环

        规则还可以通过继承拿到 LHS 部分,语法:rule "rule1" extends "rule2" ,rule1继承了rule2,同时只会继承LHS部分。

        通过这节介绍相信你对如何使用 Drools 已经非常清楚了,后面的文章将继续介绍其原理和高阶应用,欢迎关注。

往期经典推荐:

系统优化都没做过?看这篇就够了-CSDN博客

MySQL为什么会选错索引-CSDN博客

一文掌握Java动态代理的奥秘与应用场景-CSDN博客

一文看懂Nacos如何实现高效、动态的配置中心管理_nacos配置中心-CSDN博客

Redis 6.0进化之路:关键新特性详解_redis6.0新特性-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SHELL(05)

SHELL(04) [ awk ] awk 编程语言 / 数据处理引擎 创造者的缩写是 : A,W,K 基于模式匹配检查输入文本 , 逐行处理并输出 通常用于Shell脚本中 , 获取指定的数据 单独使用时 , 可对文本数据做统计 grep 简单易用 , 功能少只能查 sed 功能齐全 , 搜索精度低 # 逐行处理 aw…

探索使用对比损失的孪生网络进行图像相似性比较

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 简介 在计算机视觉领域&#xff0c;准确地测量图像相似性是一项关键任务&#xff0c;具有广泛的实际应用。从图像搜索引擎到人脸识别系统和基于内容的推荐系统&#xff0c;有效比较和查找相似图像的能力非常重要。Siames…

QA测试开发工程师面试题满分问答3: python的深拷贝和浅拷贝问题

在 Python 中&#xff0c;深拷贝&#xff08;deep copy&#xff09;和浅拷贝&#xff08;shallow copy&#xff09;是用于创建对象副本的两种不同方式。 浅拷贝是创建一个新的对象&#xff0c;该对象与原始对象的内容相同&#xff08;包括内部嵌套对象的引用&#xff09;&…

Higress 基于自定义插件访问 Redis

作者&#xff1a;钰诚 简介 基于 wasm 机制&#xff0c;Higress 提供了优秀的可扩展性&#xff0c;用户可以基于 Go/C/Rust 编写 wasm 插件&#xff0c;自定义请求处理逻辑&#xff0c;满足用户的个性化需求&#xff0c;目前插件已经支持 redis 调用&#xff0c;使得用户能够…

Day4:学习尚上优选项目

学习计划&#xff1a;完成尚硅谷的尚上优选项目 学习进度&#xff1a;尚上优选项目 知识点&#xff1a; 四、 搭建平台管理端前端环境 区域管理模块 代码生成器需求分析区域管理表设计搭建环境开发区域管理接口 整合nginx 安装nginx配置nginx功能测试 商品信息管理模块 需…

LeetCode刷题:无重复字符的最长子串 详解 【3/1000 第三题】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 LeetCode解锁1000题: 打怪升级之旅htt…

【THM】Active Reconnaissance(主动侦察)-初级渗透测试

介绍 在网络安全模块的第一个房间里,我们主要进行被动侦察。在第二个房间中,我们重点关注主动侦察以及与之相关的基本工具。我们学习使用网络浏览器来收集有关我们目标的更多信息。此外,我们讨论使用简单的工具(例如ping、traceroute、telnet和 )nc来收集有关网络、系统和…

centos7 安装 nginx

一、yum 方式安装 1.安装yum工具 sudo yum install yum-utils 2. 安装epel yum install epel-release 3.安装nginx&#xff1a; yum install nginx 4.查看版本 nginx -v 5.设置开机自启动 systemctl enable nginx nginx 常用命令&#xff1a; 1&#xff09;启动nginx …

题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

题目&#xff1a;给一个不多于5位的正整数&#xff0c;要求&#xff1a;一、求它是几位数&#xff0c;二、逆序打印出各位数字。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog co…

探讨在大数据体系中API的通信机制与工作原理

** 引言 关联阅读博客文章&#xff1a;深入解析大数据体系中的ETL工作原理及常见组件 关联阅读博客文章&#xff1a;深入理解HDFS工作原理&#xff1a;大数据存储和容错性机制解析 ** 在当今数字化时代&#xff0c;数据已经成为企业发展和决策的核心。随着数据规模的不断增长…

计算机组成原理实验(汉字编码实验)

&#xff08;汉字编码实验&#xff09; 海明校验码实验

Yarn 包管理器入门指南

一、Yarn 的由来 Yarn 是一个新的 JavaScript 包管理工具,由 Facebook 的工程师们开发,于 2016 年发布。Yarn 的诞生源于 NPM 在使用过程中遇到的一些痛点,如网络效率低下、缓存混乱、安装速度慢等问题。Yarn 秉承了 NPM 的部分理念,同时也做出了一些创新,以期提供更高效、安全…

每天五分钟计算机视觉:如何基于滑动窗口技术完成目标的检测?

汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;从左下角或者右上角元素出发&#xff0c;来寻找target。解题思路二&#xff1a;右上角元素&#xff0c;代码解题思路三&#xff1a;暴力也能过解题思路四&#xff1a;二分…

家庭网络防御系统搭建-配置流量镜像到NDR系统

由于需要将家庭网络中的全部流量送到NDR分析系统进行分析&#xff0c;因此需要一个具备流量镜像功能的交换机或者路由器。在前面文章所提及的家庭网络架构中&#xff0c;需要一台交换机即可拷贝东西向流量以及南北向流量。当然如果家庭中的路由器或者其他设备具备交换机镜像功能…

基于单片机智能数字温度采集报警器系统设计

**单片机设计介绍&#xff0c;基于单片机智能数字温度采集报警器系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机智能数字温度采集报警器系统设计的核心目标是通过单片机实现温度的实时采集、显示以及超温报警…

多层感知机与DNN算法

多层感知机与DNN算法 神经网络与深度学习神经网络深度神经网络深度学习常见分类及应用 ensorFlow编程模型1 操作2 张量3 变量4 会话 3 TensorFlow 运行模式构建神经网络模型的工具指南1. 安装 TensorFlow2. 常见深度学习算法的库函数 其他机器学习算法&#xff1a;机器学习实战…

深度学习_NLP常用库报错问题解决

1、SpaCy can‘t find model ‘zh_core_web_sm‘. It doesn‘t seem to be a python package or a valid path to a data 或者 can‘t find model ‘en_core_web_sm‘. It doesn‘t seem to be a python package or a valid path to a data 安装最新的版本&#xff1a; en_…

C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现

在前几节的研究中&#xff0c;我们已经实现网络层与业务层分离&#xff0c;本节实现数据层与业务层分离&#xff0c;降低各层之间的耦合性&#xff0c;同时实现用户注册业务。 网络层专注于处理网络通信与读写事件 业务层专注于处理读写事件到来时所需求的各项业务 数据层专…

【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)

有效的括号 题目思路及实现方式一&#xff1a;栈&#xff08;推荐&#xff09;思路代码实现Java版本C版本(由于C语言需要自己实现栈较为繁琐&#xff0c;此处使用C)Python3版本 复杂度分析 方式二&#xff1a;递归法思路代码实现Java版本C语言版本Python3版本 复杂度分析 总结相…