一、环境概述
Drools 7.0当前最新的是7.74.1 Final,Drools 8.0不兼容JDK8了(你发任你发,我用java8),7.73.0.Final这个兼容最稳定所以选这个
JDK:openjdk version "1.8.0_452"
Maven: maven 3.8.8
Drools:Drools 7.73.0.Final
二、项目依赖
当前为纯粹的Drools环境,没有引入Spring或者SpringBoot,Drools官方没有提供SpringBoot整合包,只有一个简单的Spring整合包。
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<drools.version>7.73.0.Final</drools.version>
<slf4j.version>1.7.30</slf4j.version>
<logback.version>1.2.13</logback.version>
<mvel2.version>2.4.14.Final</mvel2.version>
<lombok.version>1.18.30</lombok.version>
<junit.version>4.13.2</junit.version>
</properties>
<dependencies>
<!-- Drools 核心依赖(必须) -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools.version}</version>
</dependency>
<!-- 编译drl文件需要 -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<!-- drool-mvel -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-mvel</artifactId>
<version>${drools.version}</version>
</dependency>
<!-- mvel2 -->
<dependency>
<groupId>org.mvel</groupId>
<artifactId>mvel2</artifactId>
<version>${mvel2.version}</version>
</dependency>
<!-- 日志 SL4J+logback -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- junit 4 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
三、实体、kmodule.xml以及测试的drl文件
src/main/java/com/online/admin/entity/Person.java
package com.online.admin.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Person
{
private String name;
private int age;
}
src/main/resources/META-INF/kmodule.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这里需要注意,kbase的那么可以随便起,但是packages的名称必须和你drl文件的package声明一致 -->
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
</kbase>
</kmodule>
src/main/resources/rules/rule1.drl
package rules;
import com.online.admin.entity.Person;
rule "Age Check Rule"
when
$p : Person(age >= 18)
then
System.out.println("[规则触发] " + $p.getName() + " 是成年人,年龄: " + $p.getAge());
end
rule "Check using eval"
when
$p : Person()
eval( $p.getAge() >= 18 )
then
System.out.println("条件满足");
end
四、单元测试
import com.online.admin.entity.Person;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AppTest {
private static final Logger logger = LoggerFactory.getLogger(AppTest.class);
@Test
public void testRuleExecution() {
KieServices kieServices = null;
KieContainer kieContainer = null;
KieSession kieSession = null;
try {
//1、获取KieService
kieServices = KieServices.Factory.get();
if (kieServices == null) {
throw new IllegalStateException("无法获取KieServices实例");
}
//2、获取KieContainer
kieContainer = kieServices.getKieClasspathContainer();
if (kieContainer == null) {
throw new IllegalStateException("无法创建KieContainer");
}
//3、获取KieSession
kieSession = kieContainer.newKieSession("ksession-rules");
if (kieSession == null) {
throw new IllegalStateException("无法创建KieSession: ksession-rules");
}
//4、准备数据,插入事实对象
Person adult = new Person("李四", 25);
kieSession.insert(adult);
//5、触发规则
int firedRules = kieSession.fireAllRules();
logger.info("执行的规则数量: {}", firedRules);
}
catch (IllegalArgumentException e)
{
logger.error("参数错误: {}", e.getMessage(), e);
throw e;
}
catch (IllegalStateException e)
{
logger.error("状态错误: {}", e.getMessage(), e);
throw e;
}
catch (Exception e)
{
logger.error("规则执行过程中发生未知错误: {}", e.getMessage(), e);
throw e;
}
finally
{
// 6. 释放KieSession
if (kieSession != null) {
try
{
kieSession.dispose();
logger.debug("KieSession已释放");
}
catch (Exception e)
{
logger.warn("释放KieSession时发生错误: {}", e.getMessage());
}
}
}
}
}