springboot整合drools规则引擎

本文介绍了如何在SpringBoot项目中集成Drools规则引擎,包括添加依赖、编写实体类和规则、配置kmodule.xml,以及处理测试过程中遇到的问题,如Maven版本和依赖冲突等。
摘要由CSDN通过智能技术生成

*.写在前面

此教程只是一个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 开发步骤:

  1. 获取kieServices
  2. 获取kieContainer
  3. 创建 kieSession 对象来管理规则的应用和执行过程
  4. 将事实(Facts)插入到 kieSession 中(insert fact
  5. 触发规则:执行规则后,可以从 kieSession 中获取相应的结果
  6. 关闭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>

*.写在最后

我们的教程到此结束了,在整合的过程中我们可能还会遇到奇奇怪怪的错误,例如

遇到问题不要慌,先检查自己的配置文件是否存在错误,确定配置文件完全正确的情况下检查自己的代码是否有错。在确实没办法了,学会用关键词搜索问题能省不少时间。加油,各位爪哇岛攻城狮!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值