商务服务
探索Drools:史上最全面的使用指南
2024-12-29 23:04

什么是规则引擎

规则引擎,全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模板编写业务决策(业务规则,由用户或开发者在需要时进行配置、管理。

需要注意的的规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务规则管理系统。目前市面上具体的规则引擎产品有:drools、VisualRules、iLog等。

规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。规则引擎其实就是一个输入输出平台。

使用规则引擎的优势

  1. 业务规则与系统代码分离,实现业务规则的集中管理
  2. 在不重启服务的情况下可随时对业务规则进行扩展和维护
  3. 可以动态修改业务规则,从而快速响应需求变更
  4. 规则引擎是相对独立的,只关心业务规则,使得业务分析人员参与编辑、维护系统的业务规则
  5. 减少了硬编码业务规则的成本和风险
  6. 使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得简单

规则引擎应用场景

对于业务规则会频繁变动的系统比较适合使用规则引擎,例如

  1. 风险控制系统-风险评估、风险贷款
  2. 征信验证
  3. 促销平台系统-满减、打折等

Drools介绍

drools是一款由JBoss组织提供的基于java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(如存放在数据库中,使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。

drools官网:Drools - Drools - Business Rules Management System (Java™, Open Source)

drools中文网:Drools中文网 | 基于java的功能强大的开源规则引擎

drools源码下载地址:GitHub - kiegroup/drools: This repository is a fork of apache/incubator-kie-drools. Please use upstream repository for development.

电商平台促销积分活动

活动规则是根据用户购买订单的金额给用户送相应的积分,购买的越多送的越多,用户可以使用积分来兑换相应的商品。

用户购买的金额和对应赠送积分规则如下:

序号

赠送积分

规则

1

0

100元以下的商品

2

100

100元-500元的商品

3

500

500元-1000元的商品

4

1000

1000以上的商品

传统实现代码(伪代码
 
Drools实现代码

第一步:创建Maven工程并导入drools相关Maven依赖

 

第二步:根据drools要求在指定路径创建/resources/meta-INF/kmodule.xml配置文件

 

第三步:创建实体类Order

 

第四步:创建规则文件/resources/rules/score-rules.drl文件

 

drools API开发步骤如下

第五步:编写单元测试

 

控制台结果

通过上面的入门案例我们可以发现,使用Drools规则引擎主要工作就是编写规则文件,在规则文件中定义跟业务相关的业务规则,例如案例定义的就是购物积分规则。规则定义好后就需要调用Drools提供的API将数据提供给规则引擎进行规则模式匹配,规则引擎会执行匹配成功的规则并将计算的结果返回给我们。

使用规则引擎时业务规则可以做到动态管理。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更新、统计等。这样就可以做到在不重启服务的情况下调整业务规则。

规则文件构成

在使用Drools时非常重要的一个工作就是编写规则文件,通常规则文件的后缀为.drl

drl是Drools Rule Language的缩写,在规则文件中编写具体的规则内容

规则文件内容构成如下

关键字

描述

package

包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用

import

用于导入类或者静态方法

global

全局变量

function

自定义函数

query

查询

rule end

规则体

规则提语法构成

规则体是规则文件内容中的重要组成部分,是进行业务规则判断、处理业务结果的部分

规则体语法结构如下

 

rule关键字,表示规则开始,参数为规则的唯一名称

attributes规则属性,是rule与when之间的参数,为可选性

when关键字,后面跟规则的条件部分

LHS是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的 条件元素

RHS是规则的后果或行动部分的他通用名称

注释

在drl形式的规则文件中使用注释和Java类中使用注释一致,分为单行注释和多行注释

单行注释用“//”进行标记,多行注释用“”结束

 

Pattern模式匹配

Pattern的语法结构为:绑定变量名:Object(Field约束)

其中绑定变量名可以省略,通常绑定变量名的命名一般建议以$开始。如果定义了绑定变量名,就可以在规则体的RHS部分使用此绑定变量名来操作相应的Fact对象。Filed约束部分是需要返回true或者false的0个或多个表达式的

 

以上条件必须同时满足当前规则才有可能被激活

比较操作符

Drools提供了十二种比较操作符,其中前六种是比较常用的

符号

说明

1

>

大于

2

<

小于

3

>=

大于等于

4

<=

小于等于

5

==

等于

6

!=

不等于

7

contains

检查⼀个Fact对象的某个属性值是否包含⼀个指定的对象值

8

not contains

检查⼀个Fact对象的某个属性值是否不包含⼀个指定的对象值

9

memberOf

判断⼀个Fact对象的某个属性是否在⼀个或多个集合中,如果是字符串判断的标准就变为:该字符串是否包含Fact对象的字段内容了。当然这个过程并不会神奇的转换成数组什么的,仅仅类似于Java中String提供的contains方法的比较

10

not memberOf

判断⼀个Fact对象的某个属性是否不在⼀个或多个集合中

11

matches

判断⼀个Fact对象的属性是否与提供的标准的Java正则表达式进⾏匹配

12

not matches

判断⼀个Fact对象的属性是否不与提供的标准的Java正则表达式进⾏匹配

contains操作符

 
 

not contains操作符

 
 

memberOf操作符

 
 

not memberOf操作符

 
 

matches操作符

 
 

not matches操作符

 
 

执行指定规则

Drools还提供了多种方法来实现指定规则运行

  1. 重写AgendaFilter拦截,可以在内部通过代码实现指定规则运行,返回true代表运行,false代表不允许
 

  1. 通过RuleNameEndsWithAgendaFilter方法实现指定以某个字符串结尾的规则
 
 

  1. 通过RuleNameEqualsAgendaFilter指定某个规则运行
 

  1. 通过RuleNameStartsWithAgendaFilter指定某个字符串开头的规则
 

  1. 通过RuleNameSerializationAgendaFilter根据序列化规则名称运行
  2. 通过RuleNameMatchesAgendaFilter根据正则运行

关键字

Drools中的关键字分为:Hard keywords和Soft keywords

硬关键字是我们在规则文件中定义包名或者规则名时明确不能使用的,否则程序会报错。软关键字虽然可以使用,但是不建议使用。如果关键字设置为字符串程序会不会报错的,但不建议使用

Hard keywords:true false null then when等规则体的名称

Soft keywords:lock-on-active date-effective date-expires no-loop auto-focus activation-group agenda-group ruleflow-group entry-point duration package import dialect salience enabled attributes rule extend when then template query declare function global eval not in or and exists forall accumulate collect from action reverse result end over init

Drools内置方法

规则文件中的右手边(RHS)主要用于通过插入、删除或修改工作内存中的事实数据,以实现对规则引擎的控制。Drools提供了一系列方法,用于操作工作内存中的数据。在数据操作完成后,规则引擎会重新匹配相关规则,之前未成功匹配的规则可能因我们的数据修改而成功匹配。

update方法

更新工作内存的数据,并让相关的规则重新匹配

 
 
insert方法

插入数据到工作内存中,并让相关的规则重新匹配

 
 
retract方法

删除工作内存中的数据,并让相关的规则重新匹配

 
 
 

规则体如下,规则熟悉主要是声明在attributes位置

 

部分常用属性如下

属性名

说明

salience

指定规则执行优先级

dialect

指定规则使用的语言类型,取值为Java和mvel

enabled

指定规则是否启用

date-effective

指定规则生效时间

date-expires

指定规则失效时间

activation-group

激活分组,具有相同分组名称的规则只能有一个规则触发

agenda-group

议程分组,只有获取焦点的组中的规则才有可能触发

timer

定时器,指定规则触发的时间

auto-focus

自动获取焦点,一般结合agenda-group一起使用

no-loop

防止死循环

enabled属性

enabled属性对应的值为true和false,如果没有声明就默认true

用于指定当前规则是否启用,如果设置的false则无论当前规则是否满足要求都不会执行

 
 
dialect属性

dialect用于指定规则使用的语言类型,取值为Java和mvel。默认值为Java

salience属性

salience属性用于指定规则执行优先级。数值越大越先执行。如果不设置则默认从上往下的顺序执行

 
 

salience属性设置前执行结果

salience属性设置后执行结果

no-loop属性

no-loop属性用于只让规则执行异常,防止死循环。规则通过update函数修改了对象数据时,会使当前规则再次被激活从而导致死循环。值类型为Boolean,默认值为false

 
 

no-loop属性设置前结果

no-loop属性设置后结果

activation-group属性

activation-group属性用于激活分组,相同分组名的规则只有一个规则被触发

 
 

auto-focus属性

auto-focus属性用于自动获取焦点,类型未Boolean,默认值为false。一般结合activation-group属性使用,当一个分组未获取焦点时,可以通过auto-focus属性控制

 
 
timer属性

timer属性用于指定时间执行方法,也叫定时器。可以通过两种方式实现

方法一timer(5s 2s) //第一个参数表示几面后执行,第二个参数表示每隔几秒执行一次,第二个参数可选

 
 

方法二timer(cron:0/1 * * * * ?) //此方法使用cron表达式来指定规则执行的时间

 
 

date-effective属性

date-effective属性用于指定规则的生效时间,系统时间大于等于设置的时间规则才可能出发。默认日期格式为:dd-MMMM-yyyyy。用于可以自定义日期格式

 
 

date-expires属性

date-expires属性用于指定规则的失效时间,系统时间小于设置的日期规则才有可能出发。默认日期格式为:dd-MMMM-yyyyy。用于可以自定义日期格式

 
 

关键字

描述

package

包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用

import

用于导入类或者静态方法

global

全局变量

function

自定义函数

query

查询

rule end

规则体

global全局变量

global关键字用于规则文件中定义全局变量。 可以用来为规则文件提供数据

语法结构:global 对象类型 对象名称

tips如果对象类型为包装类型,在一个规则文件改变了global值,那么只在当前规则有效,其他规则中的global不受影响。如果对象类型为集合类型或JavaBean时,在一个规则文件改变了global值,对Java代码和所有规则都有效

包装类型示例

 
 

其他类型示例

 
 

query查询

query查询提供了查询工作内存中符合约束条件对象的方法

 
 

带有条件的query

 
 

function函数

function关键字用于在规则文件中定义函数,跟Java类中的方法一样。好处是可以将业务逻辑集中放置在一起

语法结构

 

示例代码

 
 

未完待续..........................................

    以上就是本篇文章【探索Drools:史上最全面的使用指南】的全部内容了,欢迎阅览 ! 文章地址:https://sicmodule.kub2b.com/news/12582.html
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 企库往资讯移动站 https://sicmodule.kub2b.com/mobile/ , 查看更多   
最新文章
运营师抖音代运营
运营师抖音代运营:掌握流行短视频潮流的神奇职业短视频平台已经成为人们娱乐、学习和社交的重要方式。在众多的短视频平台中,抖
微短剧,2024年“最大赢家”? | 年终盘点
2024,短剧行业大变样。作者 | 张语格编辑 | 趣解商业文娱组“互联网大厂争相入局。”“98%的短剧制作方都在亏钱。”“用户被免
同类第一!20%弹性的人工智能 ETF 科创(588760)今日上市,一键布局科创板优质AI龙头
  最新公告内容显示,广发上证科创板交易型开放式指数投资基金(基金代码:588760;扩位简称: ETF 科创)已于 2025 年 1 月 1
如何使用关键词排名提升工具
随着互联网的飞速发展,自媒体行业逐渐成为热门领域,许多自媒体作者希望通过优质内容吸引更多粉丝,提高自己的知名度,在众多竞
2025快手广告跳转微信如何实现?配置详解
​​快手作为中国领先的短视频平台,拥有庞大的用户基础和高度的用户活跃度,为品牌提供了一个巨大的流量池。然而,如何将这些流
Tiktok专题
随着TikTok在全球范围内的爆发式增长,越来越多的品牌和企业开始关注这个平台,并寻找适合他们的产品来进行市场推广。想要在TikT
什么兼职最赚钱最快速?盘点适合负债者的10个副业
在当下经济环境下,许多人可能面临负债的压力,包括买房、买车等等,寻找一份能够快速赚钱的兼职成为了许多人的迫切需求。那么,
Google回击设计_今日google搜索Google设计教程
摘要:Google回击设计,今日google搜索Google设计教程,新片场素材小编舒子颖Google回击设计,今日google搜索Google设计教程相关内
关键词排名上不去怎么办(关键词排名靠前原因)
本文目录导读:关键词选择外链建设持续优化注意事项随着自媒体行业的不断发展,越来越多的创作者加入了这个大家庭,在激烈的竞争
A股市场昨有所回落 小红书概念股继续走强
每经记者:杨建    每经编辑:赵云1月14日,A股市场全天高开高走,三大指数放量大涨。1月15日,A股市场有所回落。截至收盘,