SpringBoot整合Drools规则引擎

480 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

1、什么是规则引擎?

规则引擎就是专门来处理一些复杂业务规则的组件,可以嵌入到我们的项目中,从而将业务规则代码于项目代码剥离开。适合经常改变业务规则的的需求,比如说:领取优惠券,有很多很复杂的规则,同时不同的促销活动领取规则也有很大的变化,就非常适合将领取规则写入规则文件中,达到解耦合的作用。大多数规则引擎都支持规则的次序和规则冲突检验,支持简单脚本语言的规则实现,支持通用开发语言的嵌入开发。目前开源的规则引擎也有很多,本次为大家分享下Drools的应用。

2、Drools介绍

Drools由Codehaus开源,后加入JBoss更名为JBoss Rules,成为了JBoss应用服务器的规则引擎。Drools是一个易于访问企业策略、易于管理的开源业务规则引擎,特点就是速度快、效率高。业务人员可以利用它轻松查看业务规则,从而检验是否符合所需的业务。

KIE - Knowledge Is Everything,知识即一切。KIE包含以下项目: KIE包含以下不同但相关的项目,为业务自动化和管理提供完整的解决方案组合:

  • Drools:业务规则管理系统,处理规则文件,具有前向链接和后向链接推理的规则引擎。

  • jBPM:业务流程管理套件。

  • OptaPlanner:约束求解器,可以优化规划和调度问题。

  • Business Central:可用于自定义业务规则和流程的可视化组合。

  • UberFire:用于快速构建可扩展的工作台和Web控制台类型的应用程序。

3、整合Drools

引入maven

<properties>
  <drools.version>7.48.0.Final</drools.version>
 </properties>
<!-- 规则引擎依赖 -->
  <dependency>
   <groupId>org.kie</groupId>
   <artifactId>kie-spring</artifactId>
   <version>${drools.version}</version>
  </dependency>
  <dependency>
   <groupId>org.drools</groupId>
   <artifactId>drools-core</artifactId>
   <version>${drools.version}</version>
  </dependency>

规则文件的编写 - 通常针对一类业务规则我们会在项目里写两个文件,一个是.drt形式的模板文件,另一个是.drl形式的包含具体规则的文件。规则文件可以通过IDE安装插件来支持语法提示、高亮等。

drt示例:

//声明模板
template header

ruleName
//引入全局变量
global com.document.exception.entity.BaseException docException
//用的的java类都要导入
import java.util.Map
...

//定义模板名称
template "DocumentServerFilter"

/******* 判断是否有金融数据的改变,无则抛出StopMemo类型的例常 *******/
rule "@{ruleName}_FinancialDataChange"
salience 100  //规则的优先级
    when
        $fxtr:Fxtr();
        //TODO 具体实现,后续完成
        eval(false);
    then
       do something
       //打印
       System.out.println("No financial data changed, no documents generated。交易号:" + $fxtr.getTradeid());
       //跳出当前规则校验、后续规则也无需校验
       drools.halt();
    end

end template
//示例:

/************************************* 根据交易信息等去获取报文的默认生成规则、获取不到则抛出例常 **********************************/
rule "GenDoc_defDocGenRuleCheck"
    when
        $fxtr:Fxtr();
        $defDocGenRule:Boolean();
        eval($defDocGenRule == false);
    then
       do something
       System.out.println("未获取到默认报文生成规则!虚拟报文无法入库,交易号:" + $fxtr.getTradeid());
       //跳出当前规则校验、后续规则也无需校验
       drools.halt();
    end

好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊