Skip to content

Commit a2216cd

Browse files
committed
feat(tools\drools): Drools 规则引擎
1 parent 050ba8f commit a2216cd

12 files changed

Lines changed: 532 additions & 0 deletions

File tree

.vitepress/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ export default defineConfig({
287287
{ text: 'Hutool', link: '/tools/hutool/README' },
288288
{ text: 'Lombok', link: '/tools/lombok/README' },
289289
{ text: 'QLExpress', link: '/tools/qlexpress4/README' },
290+
{ text: 'Drools', link: '/tools/drools/README' },
290291
]
291292
},
292293
{

tools/drools/README.md

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
# Drools 规则引擎
2+
3+
Drools 是一个用 Java 编写的开源 **业务规则管理系统(BRMS)****规则引擎(rule engine)**,目前由 Apache KIE 社区维护(Apache 孵化中)。它用于将业务逻辑从应用程序代码中分离,通过声明式规则实现自动决策与业务流程自动化。
4+
5+
- [官网地址](https://kie.apache.org/)
6+
7+
8+
9+
## 基础配置
10+
11+
**添加依赖**
12+
13+
```xml
14+
<!-- 项目属性 -->
15+
<properties>
16+
<drools.version>9.44.0.Final</drools.version>
17+
</properties>
18+
<!-- 项目依赖 -->
19+
<dependencies>
20+
<!-- Drools 规则引擎 -->
21+
<dependency>
22+
<groupId>org.drools</groupId>
23+
<artifactId>drools-engine</artifactId>
24+
</dependency>
25+
26+
<!-- RuleUnit 核心 -->
27+
<dependency>
28+
<groupId>org.drools</groupId>
29+
<artifactId>drools-ruleunits-engine</artifactId>
30+
</dependency>
31+
32+
</dependencies>
33+
<dependencyManagement>
34+
<dependencies>
35+
<dependency>
36+
<groupId>org.drools</groupId>
37+
<artifactId>drools-bom</artifactId>
38+
<version>${drools.version}</version>
39+
<type>pom</type>
40+
<scope>import</scope>
41+
</dependency>
42+
</dependencies>
43+
</dependencyManagement>
44+
```
45+
46+
## 快速开始
47+
48+
### 创建 DRL
49+
50+
`src/main/resources/META-INF/ruleunits/person.drl`
51+
52+
```
53+
package io.github.atengk.drools.rules
54+
55+
import io.github.atengk.drools.model.Person
56+
import io.github.atengk.drools.ruleunit.PersonUnit
57+
58+
unit PersonUnit;
59+
60+
rule "adult person"
61+
when
62+
$p : /persons[age >= 18]
63+
then
64+
System.out.println($p.getName() + " is adult");
65+
end
66+
67+
rule "minor person"
68+
when
69+
$p : /persons[age < 18]
70+
then
71+
System.out.println($p.getName() + " is minor");
72+
end
73+
```
74+
75+
### Person 类
76+
77+
```java
78+
package io.github.atengk.drools.model;
79+
80+
import lombok.Data;
81+
82+
/**
83+
* 人员对象
84+
*
85+
* @author Ateng
86+
* @date 2026-04-08
87+
*/
88+
@Data
89+
public class Person {
90+
91+
private String name;
92+
private Integer age;
93+
94+
}
95+
```
96+
97+
### RuleUnit 数据类
98+
99+
```java
100+
package io.github.atengk.drools.ruleunit;
101+
102+
import org.drools.ruleunits.api.DataStore;
103+
import org.drools.ruleunits.api.DataSource;
104+
import org.drools.ruleunits.api.RuleUnitData;
105+
import io.github.atengk.drools.model.Person;
106+
107+
/**
108+
* 人员规则单元
109+
*
110+
* @author Ateng
111+
* @since 2026-04-08
112+
*/
113+
public class PersonUnit implements RuleUnitData {
114+
115+
private final DataStore<Person> persons = DataSource.createStore();
116+
117+
public DataStore<Person> getPersons() {
118+
return persons;
119+
}
120+
}
121+
```
122+
123+
### 规则执行服务
124+
125+
```java
126+
package io.github.atengk.drools.service;
127+
128+
import io.github.atengk.drools.model.Person;
129+
import io.github.atengk.drools.ruleunit.PersonUnit;
130+
import org.drools.ruleunits.api.RuleUnitInstance;
131+
import org.drools.ruleunits.api.RuleUnitProvider;
132+
import org.springframework.stereotype.Service;
133+
134+
/**
135+
* 规则执行服务
136+
*
137+
* @author Ateng
138+
* @since 2026-04-08
139+
*/
140+
@Service
141+
public class RuleService {
142+
143+
public void execute(Person person) {
144+
145+
PersonUnit unit = new PersonUnit();
146+
unit.getPersons().add(person);
147+
148+
RuleUnitInstance<PersonUnit> instance =
149+
RuleUnitProvider.get().createRuleUnitInstance(unit);
150+
151+
try {
152+
instance.fire();
153+
} finally {
154+
instance.close();
155+
}
156+
}
157+
}
158+
```
159+
160+
### 测试接口
161+
162+
```java
163+
package io.github.atengk.drools.controller;
164+
165+
import io.github.atengk.drools.model.Person;
166+
import io.github.atengk.drools.service.RuleService;
167+
import org.springframework.web.bind.annotation.*;
168+
169+
/**
170+
* RuleUnit 测试接口
171+
*
172+
* @author Ateng
173+
* @date 2026-04-08
174+
*/
175+
@RestController
176+
@RequestMapping("/rule")
177+
public class RuleController {
178+
179+
private final RuleService ruleService;
180+
181+
public RuleController(RuleService ruleService) {
182+
this.ruleService = ruleService;
183+
}
184+
185+
@PostMapping("/test")
186+
public String test(@RequestBody Person person) {
187+
ruleService.execute(person);
188+
return "ok";
189+
}
190+
}
191+
```
192+

tools/drools/pom.xml

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<!-- 项目模型版本 -->
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<!-- 项目坐标 -->
8+
<groupId>io.github.atengk</groupId>
9+
<artifactId>drools</artifactId>
10+
<version>1.0.0</version>
11+
<name>drools</name>
12+
<description>Drools 规则引擎</description>
13+
<url>https://kie.apache.org/</url>
14+
15+
<!-- 项目属性 -->
16+
<properties>
17+
<java.version>21</java.version>
18+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
19+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
20+
<spring-boot.version>3.5.10</spring-boot.version>
21+
<maven-compiler.version>3.14.1</maven-compiler.version>
22+
<lombok.version>1.18.42</lombok.version>
23+
<hutool.version>5.8.43</hutool.version>
24+
<fastjson2.version>2.0.53</fastjson2.version>
25+
<drools.version>9.44.0.Final</drools.version>
26+
</properties>
27+
28+
<!-- 项目依赖 -->
29+
<dependencies>
30+
<!-- Spring Boot Web Starter: 包含用于构建Web应用程序的Spring Boot依赖项 -->
31+
<dependency>
32+
<groupId>org.springframework.boot</groupId>
33+
<artifactId>spring-boot-starter-web</artifactId>
34+
</dependency>
35+
36+
<!-- Spring Boot Starter Test: 包含用于测试Spring Boot应用程序的依赖项 -->
37+
<dependency>
38+
<groupId>org.springframework.boot</groupId>
39+
<artifactId>spring-boot-starter-test</artifactId>
40+
<scope>test</scope>
41+
</dependency>
42+
43+
<!-- Lombok: 简化Java代码编写的依赖项 -->
44+
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
45+
<dependency>
46+
<groupId>org.projectlombok</groupId>
47+
<artifactId>lombok</artifactId>
48+
<version>${lombok.version}</version>
49+
<scope>provided</scope>
50+
</dependency>
51+
52+
<!-- Hutool 工具类 -->
53+
<dependency>
54+
<groupId>cn.hutool</groupId>
55+
<artifactId>hutool-all</artifactId>
56+
<version>${hutool.version}</version>
57+
</dependency>
58+
59+
<!-- 高性能的JSON库 -->
60+
<dependency>
61+
<groupId>com.alibaba.fastjson2</groupId>
62+
<artifactId>fastjson2</artifactId>
63+
<version>${fastjson2.version}</version>
64+
</dependency>
65+
66+
<!-- Drools 规则引擎 -->
67+
<dependency>
68+
<groupId>org.drools</groupId>
69+
<artifactId>drools-engine</artifactId>
70+
</dependency>
71+
72+
<!-- RuleUnit 核心 -->
73+
<dependency>
74+
<groupId>org.drools</groupId>
75+
<artifactId>drools-ruleunits-engine</artifactId>
76+
</dependency>
77+
78+
</dependencies>
79+
80+
<!-- Spring Boot 依赖管理 -->
81+
<dependencyManagement>
82+
<dependencies>
83+
<dependency>
84+
<groupId>org.springframework.boot</groupId>
85+
<artifactId>spring-boot-dependencies</artifactId>
86+
<version>${spring-boot.version}</version>
87+
<type>pom</type>
88+
<scope>import</scope>
89+
</dependency>
90+
<dependency>
91+
<groupId>org.drools</groupId>
92+
<artifactId>drools-bom</artifactId>
93+
<version>${drools.version}</version>
94+
<type>pom</type>
95+
<scope>import</scope>
96+
</dependency>
97+
</dependencies>
98+
</dependencyManagement>
99+
100+
<!-- 普通仓库配置 -->
101+
<repositories>
102+
<!-- 阿里云中央仓库 -->
103+
<repository>
104+
<id>aliyun-central</id>
105+
<name>阿里云 Maven Central 镜像</name>
106+
<url>https://maven.aliyun.com/repository/central</url>
107+
</repository>
108+
109+
<!-- Maven 官方中央仓库 -->
110+
<repository>
111+
<id>maven-central</id>
112+
<name>Maven 官方中央仓库</name>
113+
<url>https://repo.maven.apache.org/maven2/</url>
114+
</repository>
115+
</repositories>
116+
117+
<!-- 构建配置 -->
118+
<build>
119+
<finalName>${project.name}-${project.version}</finalName>
120+
<plugins>
121+
<!-- Maven 编译插件 -->
122+
<plugin>
123+
<groupId>org.apache.maven.plugins</groupId>
124+
<artifactId>maven-compiler-plugin</artifactId>
125+
<version>${maven-compiler.version}</version>
126+
<configuration>
127+
<source>${java.version}</source>
128+
<target>${java.version}</target>
129+
<encoding>${project.build.sourceEncoding}</encoding>
130+
<!-- 编译参数 -->
131+
<compilerArgs>
132+
<!-- 启用Java 8参数名称保留功能 -->
133+
<arg>-parameters</arg>
134+
</compilerArgs>
135+
</configuration>
136+
</plugin>
137+
138+
<!-- Spring Boot Maven 插件 -->
139+
<plugin>
140+
<groupId>org.springframework.boot</groupId>
141+
<artifactId>spring-boot-maven-plugin</artifactId>
142+
<version>${spring-boot.version}</version>
143+
<executions>
144+
<execution>
145+
<id>repackage</id>
146+
<goals>
147+
<goal>repackage</goal>
148+
</goals>
149+
</execution>
150+
</executions>
151+
</plugin>
152+
</plugins>
153+
<resources>
154+
<!-- 第一个资源配置块 -->
155+
<resource>
156+
<directory>src/main/resources</directory>
157+
<filtering>false</filtering>
158+
</resource>
159+
<!-- 第二个资源配置块 -->
160+
<resource>
161+
<directory>src/main/resources</directory>
162+
<includes>
163+
<include>application*</include>
164+
<include>bootstrap*.yml</include>
165+
<include>common*</include>
166+
<include>banner*</include>
167+
</includes>
168+
<filtering>true</filtering>
169+
</resource>
170+
</resources>
171+
</build>
172+
173+
</project>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.github.atengk.drools;
2+
3+
import io.github.atengk.drools.ruleunit.PersonUnit;
4+
import org.drools.ruleunits.api.RuleUnitProvider;
5+
import org.springframework.boot.SpringApplication;
6+
import org.springframework.boot.autoconfigure.SpringBootApplication;
7+
8+
@SpringBootApplication
9+
public class ToolsDroolsApplication {
10+
11+
public static void main(String[] args) {
12+
SpringApplication.run(ToolsDroolsApplication.class, args);
13+
}
14+
15+
}

0 commit comments

Comments
 (0)