当前位置:首页 > 技术 > 正文内容

Drools 规则引擎快速入门与实战

访客 技术 2026年7月15日 1

一、引擎概述与应用场景

Drools 是一款开源的业务规则管理系统(BRMS),能够将复杂的业务决策逻辑从应用程序代码中剥离出来,实现业务规则的集中管理与动态调整。典型应用场景包括:风控策略、促销规则、评分卡模型、审批流程等需要频繁变更业务逻辑的领域。

二、实战案例:电商促销定价

假设某平台双十一活动规则如下:

  • 订单金额 (0, 500]:享受 8.5 折优惠
  • 订单金额 (500, 1000]:享受 8 折优惠
  • 订单金额 (1000, +∞):立减 300 元

三、项目构建步骤

3.1 工程初始化

使用 Gradle 构建工具创建 Java 项目,JDK 版本建议 1.8 及以上。创建包结构 com.example.promotion,并建立核心实体类 OrderItem.java

package com.example.promotion;

public class OrderItem {
    private String skuName;
    private double originalAmount;
    private double payableAmount;

    public OrderItem() {}

    public OrderItem(String skuName, double originalAmount) {
        this.skuName = skuName;
        this.originalAmount = originalAmount;
    }

    public String getSkuName() {
        return skuName;
    }

    public void setSkuName(String skuName) {
        this.skuName = skuName;
    }

    public double getOriginalAmount() {
        return originalAmount;
    }

    public void setOriginalAmount(double originalAmount) {
        this.originalAmount = originalAmount;
    }

    public double getPayableAmount() {
        return payableAmount;
    }

    public void setPayableAmount(double payableAmount) {
        this.payableAmount = payableAmount;
    }
}

3.2 依赖配置

build.gradle 中引入 Drools 核心库:

plugins {
    id 'java'
    id 'application'
}

application {
    mainClass = 'com.example.promotion.PromotionLauncher'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.kie:kie-api:7.5.0.Final'
    implementation 'org.drools:drools-compiler:7.5.0.Final'
    testImplementation 'junit:junit:4.12'
}

3.3 规则文件编写

src/main/resources 下创建 promotion/rules 目录,新建 discount-rules.drl

package com.example.promotion;

rule "tier_one_discount"
    when
        item : OrderItem(originalAmount > 0 && originalAmount <= 500)
    then
        double discounted = item.getOriginalAmount() * 0.85;
        item.setPayableAmount(discounted);
        System.out.println(item.getSkuName() + " 适用一档优惠,实付:" + discounted);
end

rule "tier_two_discount"
    when
        item : OrderItem(originalAmount > 500 && originalAmount <= 1000)
    then
        double discounted = item.getOriginalAmount() * 0.8;
        item.setPayableAmount(discounted);
        System.out.println(item.getSkuName() + " 适用二档优惠,实付:" + discounted);
end

rule "tier_three_discount"
    when
        item : OrderItem(originalAmount > 1000)
    then
        double discounted = item.getOriginalAmount() - 300;
        item.setPayableAmount(discounted);
        System.out.println(item.getSkuName() + " 适用三档优惠,实付:" + discounted);
end

3.4 引擎配置

src/main/resources/META-INF 目录放置 kmodule.xml

<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <kbase name="promotionBase" packages="promotion.rules">
        <ksession name="promotionSession" />
    </kbase>
</kmodule>

配置要点说明:

  • kbase:规则知识库,packages 指向规则文件所在资源路径
  • ksession:规则会话实例,name 全局唯一,用于运行时获取会话
  • 单个 kmodule 可配置多个 kbase,每个 kbase 可包含多个 ksession

3.5 执行入口

创建 PromotionLauncher.java 驱动规则执行:

package com.example.promotion;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class PromotionLauncher {
    public static void main(String[] args) {
        new PromotionLauncher().execute();
    }

    private void execute() {
        KieServices services = KieServices.Factory.get();
        KieContainer container = services.getKieClasspathContainer();
        KieSession session = container.newKieSession("promotionSession");

        OrderItem bluetoothSpeaker = new OrderItem("便携式蓝牙音箱", 299);
        OrderItem smartphone = new OrderItem("5G智能手机", 998);
        OrderItem refrigerator = new OrderItem("双开门冰箱", 2299);

        session.insert(bluetoothSpeaker);
        session.insert(smartphone);
        session.insert(refrigerator);

        session.fireAllRules();
        session.dispose();
    }
}

四、编程式加载方式

除配置文件外,Drools 7.x 仍支持纯代码加载规则,适用于动态规则场景:

package com.example.promotion;

import org.drools.core.builder.conf.impl.DecisionTableConfigurationImpl;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class ProgrammaticLoader {
    public static void main(String[] args) {
        KieServices ks = KieServices.Factory.get();
        KieFileSystem kfs = ks.newKieFileSystem();
        
        kfs.write("src/main/resources/promotion/rules/discount-rules.drl",
                ks.getResources().newClassPathResource("promotion/rules/discount-rules.drl"));
        
        KieBuilder kb = ks.newKieBuilder(kfs).buildAll();
        KieModule km = kb.getKieModule();
        KieContainer kc = ks.newKieContainer(km.getReleaseId());
        
        KieSession session = kc.newKieSession();
        
        OrderItem tablet = new OrderItem("平板电脑", 1899);
        session.insert(tablet);
        session.fireAllRules();
        session.dispose();
    }
}

五、规则文件格式扩展

Drools 支持多种规则定义格式,除 .drl 外还包括:

  • 决策表:Excel 格式(.xls / .xlsx),适合业务人员维护
  • CSV 表格:轻量级规则批量导入
  • DSL 领域语言:贴近自然语言的规则描述
  • 决策模型标注:DMN 标准,图形化规则编排
标签: DroolsBRMS

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。