*.写在前面
此教程只是一个Spring Boot 应用程序中整合 Drools的小demo,关于drools更多的功能请查阅官方文档。
1.添加依赖
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
注意:${drools.version}为drools的版本,本教程使用的版本是“7.60.0.Final”,springboot版本:2.7.16
2.编写实体类
import lombok.Data;
@Data
public class TestUser {
private int id;
private String name;
private String address;
private String idNo;
private int age;
}
备注:项目中添加了lombok,若未使用请自行添加getter和setter方法
3.编写规则
在resource目录下创建一个存放规则的文件夹,添加一个*.drl文件
编写*.drl文件
package drools
dialect "java"
import com.gr.drools.domain.TestUser
rule "rule1"
when
$user:TestUser(age>18)
then
$user.setName("张三");
System.out.println("执行规则成功!");
System.out.println($user);
end
注意:
1.package指定了规则文件所属的包,它将被用来区分不同的规则文件,也可以用来指定规则的范围和作用域。
2.import导入了一个类型,即 TestUser 类型,以便在规则中使用。这个类型是规则文件所在项目中定义的一个类。
3.rule定义了一个规则的名称,即 "rule1"。这个名称是一个标识符,用来唯一标识这个规则。规则名称是一个字符串,可以根据实际需求自定义。
如果我们使用IDEA开发drools应用,IDEA已经集成了drools插件。
4.测试
drools API 开发步骤:
- 获取kieServices
- 获取kieContainer
- 创建 kieSession 对象来管理规则的应用和执行过程
- 将事实(Facts)插入到 kieSession 中(insert fact)
- 触发规则:执行规则后,可以从 kieSession 中获取相应的结果
- 关闭kieSession
代码示例:
@SpringBootTest
class SpringbootDroolsDemoApplicationTests {
@Test
void droolsTest() {
TestUser user = new TestUser();
user.setAge(20);
//获取kieServices
KieServices kieServices = KieServices.Factory.get();
//获取kieContainer
KieContainer kieContainer = kieServices.getKieClasspathContainer();
//创建 kieSession 对象来管理规则的应用和执行过程
KieSession kieSession = kieContainer.newKieSession();
//insert fact
kieSession.insert(user);
//触发规则
kieSession.fireAllRules();
//关闭kieSession
kieSession.dispose();
}
}
运行测试:
嗯????????
怎么报错了……
这啥东西啊……
Cannot find a default KieSession:找不到默认的KieSession
原因:我们需要一个配置文件告诉代码规则文件*.drl在哪,在drools中,这个文件就是kmodule.xml,需要将kmodule.xml文件放置在resource/META-INF文件夹下。
在resource目录新建META-INF文件夹,创建kmodule.xml文件
<?xml version="1.0" encoding="utf-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<!--
name:指定kbase的名称,可以任意,但是需要唯一
packages:指定规则文件的目录,需要根据实际情况境写,否则无法加载到规则文件
default:指定当前kbase是否为默认
-->
<kbase name="userKbase" packages="drools" default="true">
<!--
name:指定ksession名称,可以任意,但是需要唯一
default:撒定当前session是否为默认
-->
<ksession name="ksession-rule" default="true"/>
</kbase>
</kmodule>
添加完配置文件之后运行测试
嗯????????
怎么还是报错了……
You're trying to compile a Drools asset without mvel. Please add the module org.drools:drools-mvel to your classpath.
您正在尝试编译没有mvel的Drools资产。请添加模块org.drools:drools-mvel到你的类路径。
原因:版本导致的,在Drools7.44.0后,将原本在drools-core中的mvel独立出来了
解决方案1:降低Drools版本
解决方案2:添加drools-mvel依赖(推荐)
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-mvel</artifactId>
<version>${drools.version}</version>
</dependency>
备注:drools-mvel的版本需要与drools一致
添加drools-mvel依赖后运行测试
终于成功了!
附:完整pom.xml如下
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.16</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gr</groupId>
<artifactId>springboot-drools-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-drools-demo</name>
<description>springboot-drools-demo</description>
<properties>
<java.version>17</java.version>
<drools.version>7.60.0.Final</drools.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-mvel</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder-jammy-base:latest</builder>
</image>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
*.写在最后
我们的教程到此结束了,在整合的过程中我们可能还会遇到奇奇怪怪的错误,例如
遇到问题不要慌,先检查自己的配置文件是否存在错误,确定配置文件完全正确的情况下检查自己的代码是否有错。在确实没办法了,学会用关键词搜索问题能省不少时间。加油,各位爪哇岛攻城狮!