规则引擎A B测试实战教程 - 第4节

4.1 Drools 架构总览

Drools 是一个基于 Rete 算法 的规则引擎,其核心架构分为三个主要层次:规则库(Production Memory)、工作内存(Working Memory) 和 推理引擎(Inference Engine)。理解这三层结构是掌握 Drools 的基础。

核心概念速览: 规则库存放所有规则定义;工作内存存放待匹配的事实对象;推理引擎负责将事实与规则进行模式匹配,并执行符合条件的规则动作。
Drools 核心架构图 规则库 Production Memory 存储 .drl 规则文件 工作内存 Working Memory 存放 Fact 对象 推理引擎 Inference Engine 模式匹配与执行 读取 插入 更新 议程(Agenda) 冲突解决与执行顺序 激活规则 说明:Rete 算法通过构建规则网络,避免重复模式匹配,大幅提升大规模规则集的执行效率。

4.1.1 关键组件说明

组件职责类比
规则库存储所有规则定义(.drl 文件)法律条文汇编
工作内存存放应用程序插入的 Fact 对象案件事实记录
推理引擎执行模式匹配、冲突解决、规则激活法官与陪审团
议程管理已激活规则的执行顺序庭审日程表

4.2 安装与配置

Drools 可以独立运行,也可以集成到 Java 项目中。本教程采用 Maven 项目 + Drools 7.x 的方式,适合企业级开发场景。

4.2.1 环境要求

  • JDK:1.8 及以上(推荐 JDK 11)
  • Maven:3.6+
  • IDE:IntelliJ IDEA 或 Eclipse(安装 Drools 插件可选)

4.2.2 Maven 依赖配置

在 pom.xml 中添加以下核心依赖:

<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-core</artifactId>
    <version>7.73.0.Final</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>7.73.0.Final</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-mvel</artifactId>
    <version>7.73.0.Final</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.36</version>
</dependency>
版本提示: 7.73.0.Final 是 Drools 7 系列的稳定版本。如果使用 Spring Boot,建议使用 drools-spring-boot-starter 简化配置。

4.3 第一个 Hello World 规则

我们将创建一个简单的规则:当用户年龄大于等于 18 岁时,打印“Hello, adult!”。通过这个例子,你将掌握规则文件的结构和执行流程。

4.3.1 项目结构

src/
├── main/
│   ├── java/
│   │   └── com/example/
│   │       ├── model/
│   │       │   └── Person.java
│   │       └── Main.java
│   └── resources/
│       └── rules/
│           └── hello.drl
└── pom.xml

4.3.2 创建 Fact 类

规则引擎操作的是 POJO 对象,称为 Fact。创建一个 Person 类:

package com.example.model;

public class Person {
    private String name;
    private int age;

    // 必须提供无参构造
    public Person() {}

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter 和 Setter 方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

4.3.3 编写规则文件(hello.drl)

规则文件使用 .drl 扩展名,包含 package、import 和 rule 三部分:

package com.example.rules

import com.example.model.Person

rule "Hello Adult"
    when
        $p: Person(age >= 18)
    then
        System.out.println("Hello, " + $p.getName() + "! You are an adult.");
end

rule "Hello Minor"
    when
        $p: Person(age < 18)
    then
        System.out.println("Hello, " + $p.getName() + "! You are a minor.");
end
常见错误: 规则文件中的 when 和 then 关键字必须小写;条件表达式中的属性名必须与 Fact 类的 Getter 方法对应(例如 age 对应 getAge())。

4.3.4 执行规则

在 Main.java 中加载规则文件、插入 Fact 并触发规则:

package com.example;

import com.example.model.Person;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class Main {
    public static void main(String[] args) {
        // 1. 获取 KieServices 实例
        KieServices ks = KieServices.Factory.get();
        // 2. 从 classpath 加载 kmodule.xml 和规则文件
        KieContainer kContainer = ks.getKieClasspathContainer();
        // 3. 创建会话
        KieSession kSession = kContainer.newKieSession();

        // 4. 插入 Fact 对象
        Person p1 = new Person("Alice", 20);
        Person p2 = new Person("Bob", 15);
        kSession.insert(p1);
        kSession.insert(p2);

        // 5. 触发所有规则
        kSession.fireAllRules();

        // 6. 释放资源
        kSession.dispose();
    }
}

4.3.5 运行结果

控制台输出:

Hello, Alice! You are an adult.
Hello, Bob! You are a minor.

两条规则分别匹配了不同的 Person 对象,说明规则引擎成功根据 age 条件进行了分支判断。

4.4 规则执行流程可视化

下面这张图展示了从规则加载到结果输出的完整流程:

Hello World 规则执行流程 1. 创建 KieSession 2. 插入 Fact 3. 模式匹配 4. 执行动作 各步骤详细说明 1. KieServices 读取 classpath 下的 kmodule.xml,自动加载 resources/rules/ 目录下的 .drl 文件。 2. 调用 kSession.insert(fact) 将 Person 对象放入工作内存。 3. 推理引擎将 Fact 与规则库中的条件进行匹配,激活符合条件的规则。 4. 按议程顺序执行 then 部分的动作,此处为打印输出。

4.5 本章小结

  • Drools 架构由 规则库、工作内存、推理引擎 和 议程 四部分组成。
  • 通过 Maven 引入 drools-core、drools-compiler 和 drools-mvel 即可快速集成。
  • 规则文件(.drl)包含 package、import、rule ... when ... then ... end 结构。
  • 执行流程:创建 KieSession → 插入 Fact → fireAllRules → 释放资源。
课后练习: 修改 hello.drl,增加一条规则:当年龄在 18~60 之间时,输出“You are an adult worker.”。重新运行程序验证结果。