Spring Boot 中使用 Drools 规则引擎的完整步骤

规则引擎作用

规则引擎主要用于将业务逻辑从应用程序代码中分离出来,提高系统的灵活性和可维护性。规则引擎通过预定义的规则来处理输入数据并做出相应的决策,从而实现业务逻辑的自动化和动态调整。

例如

门店信息校验:美团点评在门店信息校验过程中使用规则引擎,对门店信息进行质量控制。规则包括分支条件、简单计算规则和业务定制计算规则等。通过规则引擎,门店信息校验过程变得更加高效和准确。 业务场景说明

不同会员的折扣率不同

代码结构

集成 drools(即规则引擎)到 spring boot 可以帮助你实现业务规则的动态管理和执行。下面我来简要说明一下业务场景和代码实现的步骤:

1. 添加依赖

首先,需要在 pom.xml 文件中添加 drools 的依赖:

 
        
            org.drools
            drools-compiler
            7.6.0.final
        

2. 创建规则文件

在项目的src/main/resources目录下创建一个名为rules的文件夹,并在其中创建一个名为sample.drl的规则文件:

package com.song;
import com.song.rulesobj.customer
rule "ordinary-customers"
when
    customer: customer(type == "ordinary")
then
    customer.setdiscount(0.9*customer.getoriginalprice()); // 9折  普通会员
end
rule "vip-customers"
when
    customer: customer(type == "vip")
then
    customer.setdiscount(0.6*customer.getoriginalprice()); // 6折 vip会员
end
rule "svip-customers"
when
    customer: customer(type == "svip")
then
    customer.setdiscount(0.4*customer.getoriginalprice()); // 4折 svip会员
end

3. 定义实体类

创建一个简单的实体类 customer,用于表示客户信息:

package com.song.rulesobj;
import lombok.data;
@data
public class customer {
    /**
     * 客户类型
     */
    private string type;
    /**
     * 客户订单价格
     */
    private double  originalprice; // 订单原始价格,即优惠前的价格
    /**
     * 优惠后最终结算价格
     */
    private double discount;
}

4. 配置 drools 规则引擎

在 spring boot 应用程序中配置 drools 规则引擎的 bean:

package com.song.conf;
import com.song.bean.discountbean;
import org.kie.api.kieservices;
import org.kie.api.builder.kiebuilder;
import org.kie.api.builder.kiefilesystem;
import org.kie.api.builder.kierepository;
import org.kie.api.runtime.kiecontainer;
import org.kie.api.runtime.kiesession;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
@configuration
public class droolsconfig {
    @bean
    public kiecontainer kiecontainer() {
        kieservices kieservices = kieservices.factory.get();
        kierepository kierepository = kieservices.getrepository();
        kiefilesystem kiefilesystem = kieservices.newkiefilesystem();
        kiefilesystem.write(kieservices.getresources().newclasspathresource("rules/sample.drl"));
        kiebuilder kiebuilder = kieservices.newkiebuilder(kiefilesystem);
        kiebuilder.buildall();
        return kieservices.newkiecontainer(kierepository.getdefaultreleaseid());
    }
    @bean
    public kiesession kiesession() {
        return kiecontainer().newkiesession();
    }
    @bean
    public discountbean discountbean() {
       return new  discountbean(kiesession());
    }
}

5. 应用规则引擎

在业务代码中使用注入的 kiesession 执行规则:

/*******************************************************************************
 * package: com.song.bean
 * type:    discountservice
 * date:    2024-06-28 13:45
 *
 * copyright (c) 2024 ltd all rights reserved.
 *
 * you may not use this file except in compliance with the license.
 *******************************************************************************/
package com.song.bean;
import com.song.rulesobj.customer;
import org.kie.api.runtime.kiesession;
/**
 * 功能描述: 规则处理器封装
 *
 * @author songxianyang
 * @date 2024-06-28 13:45
 */
public class discountbean {
    private kiesession kiesession;
    public discountbean(kiesession kiesession) {
        this.kiesession = kiesession;
    }
    public void applydiscount(customer customer) {
        kiesession.insert(customer); // 插入客户对象到规则引擎中
        kiesession.fireallrules(); // 执行规则
        // 客户对象已经被更新,包含了计算出的折扣
        system.out.println("客户订单价格"+customer.getoriginalprice()+"客户折扣类型: " + customer.gettype() + ", 优惠后最终结算价格: " + customer.getdiscount());
    }
}

6. 测试规则引擎

编写一个简单的测试类来验证规则引擎是否按预期工作:

package com.song.web;
import com.song.bean.discountbean;
import com.song.common.annotation.responseinfoskin;
import com.song.rulesobj.customer;
import io.swagger.annotations.api;
import io.swagger.annotations.apioperation;
import org.kie.api.runtime.kiecontainer;
import org.kie.api.runtime.kiesession;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.postmapping;
import org.springframework.web.bind.annotation.requestbody;
import org.springframework.web.bind.annotation.restcontroller;
@restcontroller
@api(tags = "规则引擎")
@responseinfoskin
public class democontroller {
    @autowired
    private discountbean discountbean;
    @postmapping("/discount")
    @apioperation("打折")
    public double discount(@requestbody customer customer) {
        // 规则处理器封装
        discountbean.applydiscount(customer);
        return customer.getdiscount();
    }
}

测试截图

总结

通过上述步骤,你可以将 drools 规则引擎集成到 spring boot 应用程序中,并使用规则文件动态管理业务规则,实现不同客户类型的动态折扣计算。这种方式可以使得业务规则更易于维护和修改,同时与应用程序解耦,提高了灵活性和可维护性。

源码

到此这篇关于spring boot 中使用 drools 规则引擎的完整指南的文章就介绍到这了,更多相关spring boot drools 规则引擎内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

发布于 2025-05-07 22:59:12
分享
海报
156
上一篇:Spring Boot整合Drools规则引擎实战指南及最佳实践 下一篇:Java中减少if-else的设计模式和优化技巧
目录

    忘记密码?

    图形验证码