JDK21 与 Drools 9.44.0.Final 规则引擎

一.规则引擎基本理解

前言:规则引擎的用途,可以通过修改规则配置,从而动态调整业务规则,搭配可视化工具,适合于业务人员随时调整规则。相对于 HardCode , 虽然需要一定学习成本,但具备以下优势

  • 简化系统架构,提高可维护性
  • 规则轻量、多样化
  • 任意修改、任意加载,动态处理
  • 脚本支持、复杂逻辑支持、可扩展与复用
  • 上下文隔离,有状态与无状态会话

适用场景

  • 动作监听
  • 打折促销
  • 数据过滤
  • 消息路由
  • 会员管理
  • 积分管理

二.Drools 基本概念

Drools 是 JBoss 旗下 KIE (Knowledge is everything)体系的一个子产品,基于 Java 语言开发,用于进行规则解析与执行。

1.kmodule默认配置文件定义

默认配置文件:src/main/resources/META-INF/kmodule.xml

kbase 标签

属性 含义
name kbase 名称,全局唯一,不允许重复,可以理解为工作空间或命名空间
includes 包含,用于将多个kbase封装到一起,通过【,】分割
packages 包名,即规则文件的位置,通过【,】分割可配置多个
default 是否为默认命名空间
equalsBehavior 相等的判断逻辑,用代码说明就是 == 和 equals 的区别,即 identity 和 equality
eventProcessingMode 事件模式,stream 模式允许进行时间推理,cloud为普通fact
declarativeAgenda disable或enable 用于控制规则间逻辑关系

ksession 标签

属性 含义
name ksession 名称,全局唯一,不允许重复
type stateful 有状态,对 working memory 内数据多次处理 stateless 无状态
default 是否为默认会话
clockType 时钟类型,realtime 系统时钟 pseudo 伪时钟,可用于单元测试
beliefSystem 信仰系统,用于控制资源访问和冲突

2.规则文件

规则配置文件位置:rc/main/resources/*.drl

规则文件定义

关键字 含义
package 包名,同一个包下的查询或者函数可直接调用
import 导入类或静态方法
global 定义全局变量
function 自定义函数
query 查询
rule - end 规则体

规则体定义

关键字 含义
rule 规则体定义开始关键字
attribute 规则属性
when 关键字,后面跟规则条件,空视为 true
then 关键字,后面跟规则处理,空则不处理
end 规则体定义结束关键字

规则体条件定义

符号 含义
< 小于
<= 小于等于
== 等于
>= 大于等于
> 大于
!= 不等于
contains 包含
not contains 不包含
memberOf 属于
not memberOf 不属于
matches 正则匹配
not matches 正则不匹配

3.引擎简介

Drools 规则引擎构成

  • Working Memory(工作内存)
  • Rule Base(规则库)
  • Inference Engine(推理引擎)

其中推理引擎又包括:

  • Pattern Matcher(匹配器)
  • Agenda(议程)
  • Execution Engine(执行引擎)

4.概念说明

概念 含义
KieServices KIE的顶层抽象,用于创建、管理和获取KieContainer、KieSession等
KieContainer kbase 实例化后的一个容器,一组规则实例
KieSession 用于与 kbase 实例交互的一个会话
kieModules 通过 xml 配置进行 kbase、ksession 的声明
KieRepository 用于存放 KieModule 的单例对象,即仓库
KieProject 初始化 KieModule,并将其存放到KieRepository仓库中,然后 KieContainer 可以通过 KieProject 来查找 KieModule ,并根据这些信息构造KieBase 和 KieSession
ClasspathKieProject KieProject的一个具体实现,从根目录加载kmodule.xml配置,从而初始化一个 kiemodule
Working Memory 工作内存,将待处理数据插入进去,drools 进行处理
Fact 一个普通的 JavaBean 插入到 Working Memory 后,drools 称之为Fact 对象
Rule Base 规则库
Pattern Matcher 将规则库规则与工作内存中事实对象进行匹配,成功则将规则放到议程
Agenda 议程,存放上一步通过匹配器进行模式匹配后被激活的规则
Execution Engine 执行议程内激活的规则

三.Drools 示例

Drools 官方文档

不同版本差异较大,本示例对应版本如下

环境 版本
JDK jdk-21.0.1
Drools 9.44.0.Final

工程结构

在这里插入图片描述

Pom 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>drools-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <drools.version>9.44.0.Final</drools.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-bom</artifactId>
                <type>pom</type>
                <scope>import</scope>
                <version>${drools.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-engine</artifactId>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-mvel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-model-compiler</artifactId>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-xml-support</artifactId>
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪悟道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值