Drools规则引擎实战 drools规则引擎的优势
创始人
2025-07-04 00:40:52
0

Part 1 规则引擎

规则引擎:全称为业务规则管理系统,英文名为BRMS。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或 开发者在需要时进行配置、管理。需要注意的是规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务规则管理系统。

java开源的规则引擎有:Drools、Easy Rules、Mandarax、IBM ILOG。使用最为广泛并且开源的是Drools

主要应用场景:对于一些存在比较复杂的业务规则并且业务规则会频繁变换的系统比较适合使用规则引擎,如下:

风控决策系统-------风险贷款、风险评估

反欺诈项目-----银行贷款、征信验证、反洗钱

实时反欺诈平台-----手机支付、信用卡消费

Drools规则引擎构成

drools规则引擎由以下几部分构成:

  • Working Memory(工作内存)
  • Rules(规则库)
  • Inference Engine(推理引擎)

◆Pattern Match(匹配器)具体匹配那一个规则,由它来完成

◆Agenda(议程)

◆Execution Engine(执行引擎)

Drools规则引擎概念

Working Memory:工作内存,drools规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,所以我们开发的应用程序只需要将我们的数据插入到Working Memory中即可,例如本案例中我们调用kieSession.insert(order)就是将order对象插入到了工作内存中。

Fact:事实,是指在drools 规则应用当中,将一个普通的JavaBean插入到Working Memory后的对象就是Fact对象,例如本案例中的Order对象就属于Fact对象。Fact对象是我们的应用和规则引擎进行数据交互的桥梁或通道。

Rules:规则库,我们在规则文件中定义的规则都会被加载到规则库中。

Pattern Matcher:匹配器,将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入Agenda中。

Agenda:议程,用于存放通过匹配器进行模式匹配后被激活的规则。

Drools 基础语法

规则文件构成

关键字

描述

package 包名

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

import

用于导入类或者静态方法

global

全局变量

function

自定义函数

query

查询

rule end

规则体

一个规则通常包含三个部分:属性部分(attribute)、条件部分(LHS)和结果部分(RHS)

语法结构体:

rule "ruleName"
    attributes
    when
        LHS
    then
        RHS
end

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

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

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

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

then:关键字,后面跟规则的结果部分。

RHS(Right Hand Side):是规则的后果或行动部分的通用名称。

end:关键字,表示一个规则结束。

Part 2 规则比较操作符

符号

说明

>

大于

<

小于

>=

大于等于

<=

小于等于

==

等于

!=

不等于

contains

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

not contains

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

memberOf

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

not memberOf

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

matches

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

not matches

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

Part 3 Drools 规则属性 attributes

Drools中提供的属性如下表(部分属性)

属性名

说明

salience

指定规则执行优先级

dialect

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

enabled

指定规则是否启用

date-effective

指定规则生效时间

date-expires

指定规则失效时间

activation-group

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

agenda-group

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

timer

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

auto-focus

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

no-loop

防止死循环,防止自己更新规则再次触发

lock-on-active

no-loop增强版本。可防止别人更新规则再次出发

Part 4 项目应用

省机顶盒软探针平台为实现机顶盒用户视频使用质量的实时监控,采用实时大数据进行准实时的指标统计,指标结果推送kafka,由平台新增的告警引擎实时消费kafka数据并通过预定制的专家规则实现实时的告警判定,最终告警结果实时通知反馈到告警平台,实现告警到告警恢复的生命周期。

图片

Part 5 规则示例

rule "播放成功率告警"
no-loop true
when
    $fact:Fact()
    eval($fact.getPlay() > 0.0)
    eval($fact.getPlay() < MapUtils.getDoubleValue($fact, "playThreshold", 0.96))
then
    RuleResult fr = new RuleResult("播放成功率告警");
    fr.setRuleCode(900001);
    fr.setActualTime(MapUtils.getString($fact, "actualTime"));
    fr.setAlarmTime(RuleUtil.getAlarmTime(MapUtils.getString($fact, "actualTime"), MapUtils.getString($fact, "900001")));
    //说明当前是要告警的
    fr.setAlarmStatus("1");
    fr.setAlarmTitle("指标播放成功率异常");
    fr.setLocateInfo("指标播放成功率异常");
    fr.setAlarmText(RuleUtil.playAlarmText($fact, MapUtils.getDoubleValue($fact, "playThreshold", 0.96)));
    insert(fr);
end




rule "播放成功率告警结束"
no-loop true
when
    $fact:Fact()
    eval($fact.getPlay() >= MapUtils.getDoubleValue($fact, "playThreshold", 0.96))
    eval(MapUtils.getLongValue($fact, "900001") > 0)
    eval(RuleUtil.checkAlarmTime($fact.getActualTime(), MapUtils.getLongValue($fact, "900001_time"), MapUtils.getLongValue($fact, "reThreshold", 900000)))
then
    RuleResult fr = new RuleResult("播放成功率告警恢复");
    fr.setRuleCode(900001);
    fr.setActualTime(MapUtils.getString($fact, "actualTime"));
    fr.setAlarmTime(MapUtils.getString($fact, "900001"));
    fr.setAlarmStatus("0");
    fr.setMsg("告警恢复");
    fr.setAlarmTitle("指标播放成功率异常");
    fr.setLocateInfo("指标播放成功率异常");
logger.info("播放告警恢复了{}", $fact);
insert(fr);


相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...