深入浅出 Drools 规则引擎

2024-04-02 10:52

本文主要是介绍深入浅出 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博客

这篇关于深入浅出 Drools 规则引擎的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869787

相关文章

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)

-------------------------------特别说明--------------------------------------- 视频广告问题:因Adblock Plus的局限,存在以下现象,优酷、搜狐、17173黑屏并倒数;乐视、爱奇艺播放广告。因为这些视频网站的Flash播放器被植入了检测代码,而Adblock Plus无法修改播放器。 如需同时使用ads

Smarty模板引擎工作机制(一)

深入浅出Smarty模板引擎工作机制,我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别,并动手开发一个自己的模板引擎,以便加深对smarty模板引擎工作机制的理解。 在没有使用Smarty模板引擎的情况下,我们都是将PHP程序和网页模板合在一起编辑的,好比下面的源代码: <?php$title="深处浅出之Smarty模板引擎工作机制";$content=

MySQL技术内幕_innodb存储引擎

MySQL技术内幕_innodb存储引擎 INNODB innodb中如果表没有主键 表是否由 非空唯一键,有则该字段为主键没有,则自动创建一个6字节大小的指针 innodb存储引擎的所有数据都存储在表空间中,表空间由段,区,页(块)组成。 如果启用了 innodb_file_per_table, 则每张表内的数据可以单独放在一个表空间中即使启用了上面参数,共享表空间也会因为 系统事务信息

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能

认识鬼火引擎

一、Irrlicht简介 (1)概念Irrlicht引擎是一个用C++书写的高性能实时3D引擎,可以应用于C++程序或者.NET语言中。通过使用Direct3D(Windows平台)、OpenGL 或它自己的软件着色程序,可以实现该引的完​全跨平台。尽管是开源的,该Irrlicht库提供了可以在商业级的3D引擎上具有的艺术特性,例如动态的阴影,粒子系统,角色动画,室内和室外技术以及碰撞检测等。(

一个图形引擎的画面风格是由那些因素(技术)决定的?

可能很多人第一直覺會認為shader決定了視覺風格,但我認為可以從多個方面去考慮。 1. 幾何模型 一個畫面由多個成分組成,最基本的應該是其結構,在圖形學中通常稱為幾何模型。 一些引擎,如Quake/UE,有比較強的Brush建模功能(或應稱作CSG),製作建築比較方便。而CE則有較強的大型地表、植被、水體等功能,做室外自然環境十分出色。而另一些遊戲類型專用的引擎,例