【Java】-一文带你入门Drools规则引擎

简介: 【Java】-一文带你入门Drools规则引擎

微信截图_20220612174009.png

Drools是一款基于Java的优秀的规则引擎,将复杂多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得修改规则不需要改动代码重启服务就能生效。

Drools有一定的学习成本,官方英文文档非常详细,但中文文档少,本文将通过一篇文章来介绍Drools的使用和动态部署,这也是我学习过后的总结,希望对你入门Drools有帮助。

官网地址:https://www.drools.org/

github: https://github.com/kiegroup/drools

简单使用

一个给不同商品设置不同折扣的例子

pom.xml

<dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-compiler</artifactId>
      <version>7.23.0.Final</version>
</dependency>

kmodule.xml 文件用于配置规则脚本,可以有多个kbase

文件放在项目resources/META-INF目录下可以自动加载

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rule"/>
    </kbase>
</kmodule>

Product Bean实体

//lombok注解
@Data
public class Product {
    public static final String DIAMOND = "DIAMOND";
    public static final String GOLD = "GOLD";
    private String type;
    private int discount;
}

resources/rules/Rules.drl 规则脚本

package rules
import drools.Product
//当商品类型是DIAMOND时,打折为15%
rule Offer4Diamond
    when
        productObject:Product(type == Product.DIAMOND)
    then
        productObject.setDiscount(15);
    end
//当商品类型是GOLD时,打折为25%
rule Offer4Gold
    when
        productObject: Product(type == Product.GOLD)
    then
        productObject.setDiscount(25);
    end

junit Test

@Test
    public void droolsTest() {
        KieServices ks = KieServices.Factory.get();
        KieContainer kieContainer = ks.getKieClasspathContainer();
        KieSession kSession = kieContainer.newKieSession("ksession-rule");
        Product product = new Product();
        product.setType(Product.GOLD);
        kSession.insert(product);
        int count = kSession.fireAllRules();
        System.out.println("命中了" + count + "条规则");
        System.out.println("商品" + product.getType() + "的商品折扣为" + product.getDiscount() + "%");
    }

运行结果

命中了1条规则
商品GOLD的商品折扣为25%
解释一下

kmodule.xml

  • 该文件用来配置规则表,可以包含多个kbase,每个kbase都有name属性,不能重复
  • kbase可以包含多个ksession, packages属性是src/main/resources目录下文件夹的包路径,可以定义多个包,逗号分隔,packages目录下的所有规则文件都会被加载,除了子目录
  • ksession 的name不能重复,Java代码中KieSession设置的name就是该配置的name

droolsTest

  • KieServices
    该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KSession等信息;可以获取KieRepository对象,利用KieRepository来管理KieModule等。 
    KieServices就是一个中心,通过它来获取的各种对象来完成规则构建、管理和执行等操作。
  • KieContainer
    KieContainer可以理解为是一个KieBase的容器。
  • KieBase
    KieBase可以理解为是一个知识仓库,包含了若干的规则、流程、方法等,在Drools中主要就是规则和方法,KieBase本身并不包含运行时的数据之类的,如果需要执行规则KieBase中的规则的话,就需要根据KieBase创建KieSession。
  • KieSession
    KieSession就是一个跟Drools引擎打交道的会话,其基于KieBase创建,它会包含运行时数据,包含“事实 Fact”,并对运行时数据事实进行规则运算。我们通过KieContainer创建KieSession是一种较为方便的做法,其实他本质上是从KieBase中创建出来

动态规则

实现动态规则有这几种思路

    1. 使用Workbench,通过Web管理页面动态生成配置规则

    2. 将规则以字符串的形式存入数据库,需要自己开发一套规则管理系统

使用Wrokbench

1.docker部署workbench

workbench

docker run -p 8080:8080 -p 8001:8001 -d --name drools-wb jboss/drools-workbench-showcase:7.5.0.Final

kie-server

docker run -p 8180:8180 -d --name kie-server --link drools-wb:kie_wb jboss/kie-server-showcase:7.5.0.Final

访问http://ip地址:8080/drools-wb

默认账号/密码 admin/admin

image.png

2.创建项目

image.png


image.gifimage.png

3.创建Object

image.gifimage.png


image.gifimage.png

4.创建DRL文件

image.png


image.png

5.部署

image.png

6.使用部署的规则文件

远程规则Maven仓库地址获取

image.png


image.png

本地Maven仓库settings.xml配置,这里只摘录了需要添加的3处,需要对应去添加

<server>
      <username>admin</username>
      <password>admin</password>
      <id>guvnor-m2-repo</id>
</server>
<profile>
  <id>guvnor-m2-repo</id> 
  <repositories>
    <repository>
      <id>guvnor-m2-repo</id>
      <name>Guvnor M2 Repo</name> 
      <url>http://10.211.55.7:8080/drools-wb/maven2/</url>
      <layout>default</layout> 
      <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy> 
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy> <!--更新策略,常常 --> 
      </snapshots>
    </repository> 
  </repositories>
  <activation> 
    <activeByDefault>true</activeByDefault>
  </activation>
</profile>
<activeProfiles>
    <activeProfile>guvnor-m2-repo</activeProfile>
</activeProfiles>

创建一个标准的SpringBoot工程

Product实体,包路径要跟规则文件中的一致

@Data
public class Product {
    private String type;
    private int discount;
}

DroolsController.java

@RestController
@RequestMapping("/api/")
@Slf4j
public class DroolsController {
    @PostMapping("getdiscount")
    public Product getDiscount(Product product) throws IOException {
        KieServices ks = KieServices.Factory.get();
        //RELEASE 代表使用jar包的最新正式版
        ReleaseIdImpl releaseId = new ReleaseIdImpl("com.myteam", "test", "RELEASE");
        KieContainer kieContainer = ks.newKieContainer(releaseId);
        //自动扫描Maven仓库,有新版本会自动下载
        KieScanner kieScanner = ks.newKieScanner(kieContainer);
        kieScanner.start(3000);
        KieSession kieSession = kieContainer.newKieSession();
        kieSession.insert(product);
        int count = kieSession.fireAllRules();
        log.info("共执行了{}条规则", count);
        log.info("商品{}的折扣为{}%", product.getType(), 
        product.getDiscount());
        return product;
    }
}

PostMan访问接口

image.gifimage.png

与DRL规则文件中配置的一致

7.动态规则

修改ppdrl.drl规则表,修改GOLD的打折为50%,保存规则,将项目版本提高一个版本,并build&deploy项目

image.png


image.png


image.png

再次访问接口,GOLD的折扣已经变为50%,其中没有重启服务

image.png

相关文章
|
8天前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
97 3
|
3月前
|
IDE Java 数据挖掘
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
168 35
|
3月前
|
Java API 微服务
2025 年 Java 从入门到精通学习笔记全新版
《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
177 6
|
3月前
|
监控 Java 测试技术
2025 年 Java 核心技术从入门到精通实战指南
《2025年Java核心技术实战指南》全面覆盖Java开发的最新趋势与最佳实践。内容包括Java新特性(如模式匹配、文本块、记录类)、微服务架构(Spring Boot 3.0+、Spring Cloud)、响应式编程(Reactor、WebFlux)、容器化与云原生(Docker、Kubernetes)、数据访问技术(JPA、R2DBC)、函数式编程、单元测试与集成测试(JUnit 5、Mockito)、性能优化与监控等。通过实战案例,帮助开发者掌握构建高性能、高可用系统的技能。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
188 7
|
3月前
|
消息中间件 Java 微服务
2025 版 Java 学习路线实战指南从入门到精通
《Java学习路线实战指南(2025版)》是一份全面的Java开发学习手册,涵盖基础环境搭建、核心语法与新特性、数据结构与算法、微服务架构、云原生技术栈、AI融合及项目实战。内容包括JDK安装配置、IntelliJ IDEA设置、Records类与模式匹配增强、LeetCode题解、Spring Cloud微服务开发、Kubernetes部署、OpenAI API调用等。结合在线商城系统案例,采用Vue 3、Spring Boot 3.5、MySQL、Elasticsearch等技术,提供从理论到实践的完整路径,助力开发者掌握2025年最新趋势与最佳实践。
292 4
|
17天前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
124 1
|
11天前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
49 0
|
2月前
|
存储 缓存 NoSQL
java 集合入门基础理论的核心概念与实用长尾知识
本文介绍了Java集合框架的基础理论知识,包括单列集合(List、Set、Queue)和双列集合(Map)的特点及常用实现类(如ArrayList、HashSet、HashMap等)。详细讲解了集合的遍历方式(迭代器、增强for循环、Lambda表达式)和典型应用场景(如数据去重、键值存储等)。通过具体代码示例,帮助初学者理解集合框架的核心概念和实际应用,为Java编程中的数据存储与管理提供基础指导。
63 0
|
2月前
|
缓存 NoSQL Java
Java Web 从入门到精通之苍穹外卖项目实战技巧
本项目为JavaWeb综合实战案例——苍穹外卖系统,涵盖Spring Boot 3、Spring Cloud Alibaba、Vue 3等主流技术栈,涉及用户认证、订单处理、Redis缓存、分布式事务、系统监控及Docker部署等核心功能,助你掌握企业级项目开发全流程。
217 0
|
2月前
|
存储 安全 Java
Java 学习路线 35 掌握 List 集合从入门到精通的 List 集合核心知识
本文详细解析Java中List集合的原理、常用实现类(如ArrayList、LinkedList)、核心方法及遍历方式,并结合数据去重、排序等实际应用场景,帮助开发者掌握List在不同业务场景下的高效使用,提升Java编程能力。
264 0

热门文章

最新文章