SpringBoot+Drools决策表的使用
简介
本人最近在研究SpringBoot使用Drools规则引擎实现自动流程审批功能,期间遇到过很多坑,最终选定Drools决策表的功能,决策表方便业务人员进行规则的添加就修改操作,清晰明了,以下纯属个人学习记录,欢迎学习交流。
Drools决策表
决策表是drl规则文件的变形,以excel 格式完成对规则的匹配,通俗的讲,决策表就是向电子表格输入特点的值,并加载到Drools规则库中,可以用特定的类对表格进行转换,转换为drl文件,从而用程序进行解析。废话不多说,先来一张做完的Drools决策表如下图,Drools决策表大体包含两部分,灰色部分是决策表部分,浅蓝色部分为规则部分,下面详细说明每个关键字的作用
决策表部分关键字
关键字 | 是否必填 | 值 | 说明 |
---|---|---|---|
RuleSet | 是 | String | 在这个单元格右侧包含RuleSet的名称,与drl文件中的package一样的 |
Sequential | 否 | true/false | true则代表表格从上到下顺序执行,false 代表乱序执行 |
Import | 否 | String | 导入所需的引用的类或方法,多个类用逗号隔开 |
Functions | 否 | String | 功能与标准的drl 文件中函数相同,多个函数在每个函数后用逗号隔开,有无返回值都可以 |
Variables | 否 | String | 全局变量,多个变量用逗号隔开 |
Queries | 否 | String | 定义查询函数,多个用逗号隔开 |
RuleTable | 是 | String | 表示规则名称,在RuleTable 后面直接写规则名称,不要另起一列,规则名以逗号隔开 |
规则部分关键字
关键字 | 是否必填 | 值 | 说明 |
---|---|---|---|
CONDITION | 是 | String | 指明该列为判断条件,相当于drl文件中的when 部分,每个规则至少有一个CONDITION |
ACTION | 是 | String | 指明该列为结果,每行如果符合前面的所有CONDITION,既执行此行的ACTION,相当于drl文件中的then |
PRIORITY | 否 | int | 指明该列的值将被设置为该规则的‘lalience’(规则执行先后顺序,值越大执行顺序越靠前),但注意,若在ruleSet 下设置了sequential 为true,则PRIORITY不生效,设置为false或不设置,则PRIORITY生效 |
NAME | 否 | String | 指明该列的值将会被设置为从那行产生的规则名称 |
NO-LOOP | 否 | true/false | 指明这个规则不允许循环,与drl文件中no-loop功能一样 |
ACTIOVATION-GROUP | 否 | String | 在这个列中单元格的值,指出该规则行属于特定的活动分组。一个活动分组以为这在命名组中的规则只有一条会被引用(首条规则触发哦,中止其他规则活动)与drl中含义一样 |
AGENDA-GROUP | 否 | String | 在这个列中单元格的值,指出该规则行属于特定的议程组,可以理解成获取焦点(这是一种在规则组之间控制流的方法),与drl文件中含义一样 |
RULEFLOW-GROUP | 否 | String | 在这个列中单元格的值,指出该规则行属于特定的规则流组 |
总结
决策表必不可少的俩部分RuleSet 和RuleTable,RuleSet 后面填写转换为drl 文件的包名,一般和实体类包名一致,Import需要注意的是,在Java开发中,String,Boolean这些类型是不需要在类中Import,但是在决策表中需要Import,否则会找不到类;股则RuleTable部分主要是CONDITION和ACTION两个关键字,相当于 when … then … 当条件CONDITION满足时就执行ACTION后的动作。
SpringBoot 项目中决策表的使用
我目前使用的是通过Drools工具类KieHelper来调用决策表;大体分为以下几步:
1.pom引入所需Drools Mvn库
2.验证决策表转换drl文件是否正确
3.利用KieHelper执行drl文件
pom配置
引入drools版本配置,我使用的是7.5.0Final,引入以下6个基本上满足开发需求了
<properties>
<drools.version>7.5.0.Final</drools.version>
</properties>
<dependencies>
<!-- drools -->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${
drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId