规则引擎A B测试实战教程 - 第4节
4.1 Drools 架构总览
Drools 是一个基于 Rete 算法 的规则引擎,其核心架构分为三个主要层次:规则库(Production Memory)、工作内存(Working Memory) 和 推理引擎(Inference Engine)。理解这三层结构是掌握 Drools 的基础。
核心概念速览: 规则库存放所有规则定义;工作内存存放待匹配的事实对象;推理引擎负责将事实与规则进行模式匹配,并执行符合条件的规则动作。
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 规则执行流程可视化
下面这张图展示了从规则加载到结果输出的完整流程:
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.”。重新运行程序验证结果。