新聞中心
Part 1 規(guī)則引擎
規(guī)則引擎:全稱為業(yè)務規(guī)則管理系統(tǒng),英文名為BRMS。規(guī)則引擎的主要思想是將應用程序中的業(yè)務決策部分分離出來,并使用預定義的語義模塊編寫業(yè)務決策(業(yè)務規(guī)則),由用戶或 開發(fā)者在需要時進行配置、管理。需要注意的是規(guī)則引擎并不是一個具體的技術(shù)框架,而是指的一類系統(tǒng),即業(yè)務規(guī)則管理系統(tǒng)。

成都創(chuàng)新互聯(lián)專注于企業(yè)成都營銷網(wǎng)站建設、網(wǎng)站重做改版、訥河網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5技術(shù)、電子商務商城網(wǎng)站建設、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設公司、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為訥河等各大城市提供網(wǎng)站開發(fā)制作服務。
java開源的規(guī)則引擎有:Drools、Easy Rules、Mandarax、IBM ILOG。使用最為廣泛并且開源的是Drools。
主要應用場景:對于一些存在比較復雜的業(yè)務規(guī)則并且業(yè)務規(guī)則會頻繁變換的系統(tǒng)比較適合使用規(guī)則引擎,如下:
風控決策系統(tǒng)-------風險貸款、風險評估
反欺詐項目-----銀行貸款、征信驗證、反洗錢
實時反欺詐平臺-----手機支付、信用卡消費
Drools規(guī)則引擎構(gòu)成
drools規(guī)則引擎由以下幾部分構(gòu)成:
- Working Memory(工作內(nèi)存)
- Rules(規(guī)則庫)
- Inference Engine(推理引擎)
◆Pattern Match(匹配器)具體匹配那一個規(guī)則,由它來完成
◆Agenda(議程)
◆Execution Engine(執(zhí)行引擎)
Drools規(guī)則引擎概念
Working Memory:工作內(nèi)存,drools規(guī)則引擎會從Working Memory中獲取數(shù)據(jù)并和規(guī)則文件中定義的規(guī)則進行模式匹配,所以我們開發(fā)的應用程序只需要將我們的數(shù)據(jù)插入到Working Memory中即可,例如本案例中我們調(diào)用kieSession.insert(order)就是將order對象插入到了工作內(nèi)存中。
Fact:事實,是指在drools 規(guī)則應用當中,將一個普通的JavaBean插入到Working Memory后的對象就是Fact對象,例如本案例中的Order對象就屬于Fact對象。Fact對象是我們的應用和規(guī)則引擎進行數(shù)據(jù)交互的橋梁或通道。
Rules:規(guī)則庫,我們在規(guī)則文件中定義的規(guī)則都會被加載到規(guī)則庫中。
Pattern Matcher:匹配器,將Rule Base中的所有規(guī)則與Working Memory中的Fact對象進行模式匹配,匹配成功的規(guī)則將被激活并放入Agenda中。
Agenda:議程,用于存放通過匹配器進行模式匹配后被激活的規(guī)則。
Drools 基礎(chǔ)語法
規(guī)則文件構(gòu)成
|
關(guān)鍵字 |
描述 |
|
package 包名 |
只限于邏輯上的管理,同一個包名下的查詢或者函數(shù)可以直接調(diào)用 |
|
import |
用于導入類或者靜態(tài)方法 |
|
global |
全局變量 |
|
function |
自定義函數(shù) |
|
query |
查詢 |
|
rule end |
規(guī)則體 |
一個規(guī)則通常包含三個部分:屬性部分(attribute)、條件部分(LHS)和結(jié)果部分(RHS)
語法結(jié)構(gòu)體:
rule "ruleName"
attributes
when
LHS
then
RHS
endrule:關(guān)鍵字,表示規(guī)則開始,參數(shù)為規(guī)則的唯一名稱。
attributes:規(guī)則屬性,是rule與when之間的參數(shù),為可選項。
when:關(guān)鍵字,后面跟規(guī)則的條件部分。
LHS(Left Hand Side):是規(guī)則的條件部分的通用名稱。它由零個或多個條件元素組成。如果LHS為空,則它將被視為始終為true的條件元素。
then:關(guān)鍵字,后面跟規(guī)則的結(jié)果部分。
RHS(Right Hand Side):是規(guī)則的后果或行動部分的通用名稱。
end:關(guān)鍵字,表示一個規(guī)則結(jié)束。
Part 2 規(guī)則比較操作符
|
符號 |
說明 |
|
> |
大于 |
|
< |
小于 |
|
>= |
大于等于 |
|
<= |
小于等于 |
|
== |
等于 |
|
!= |
不等于 |
|
contains |
檢查一個Fact對象的某個屬性值是否包含一個指定的對象值 |
|
not contains |
檢查一個Fact對象的某個屬性值是否不包含一個指定的對象值 |
|
memberOf |
判斷一個Fact對象的某個屬性是否在一個或多個集合中 |
|
not memberOf |
判斷一個Fact對象的某個屬性是否不在一個或多個集合中 |
|
matches |
判斷一個Fact對象的屬性是否與提供的標準的Java正則表達式進行匹配 |
|
not matches |
判斷一個Fact對象的屬性是否不與提供的標準的Java正則表達式進行匹配 |
Part 3 Drools 規(guī)則屬性 attributes
Drools中提供的屬性如下表(部分屬性)
|
屬性名 |
說明 |
|
salience |
指定規(guī)則執(zhí)行優(yōu)先級 |
|
dialect |
指定規(guī)則使用的語言類型,取值為java和mvel |
|
enabled |
指定規(guī)則是否啟用 |
|
date-effective |
指定規(guī)則生效時間 |
|
date-expires |
指定規(guī)則失效時間 |
|
activation-group |
激活分組,具有相同分組名稱的規(guī)則只能有一個規(guī)則觸發(fā) |
|
agenda-group |
議程分組,只有獲取焦點的組中的規(guī)則才有可能觸發(fā) |
|
timer |
定時器,指定規(guī)則觸發(fā)的時間 |
|
auto-focus |
自動獲取焦點,一般結(jié)合agenda-group一起使用 |
|
no-loop |
防止死循環(huán),防止自己更新規(guī)則再次觸發(fā) |
|
lock-on-active |
no-loop增強版本??煞乐箘e人更新規(guī)則再次出發(fā) |
Part 4 項目應用
省機頂盒軟探針平臺為實現(xiàn)機頂盒用戶視頻使用質(zhì)量的實時監(jiān)控,采用實時大數(shù)據(jù)進行準實時的指標統(tǒng)計,指標結(jié)果推送kafka,由平臺新增的告警引擎實時消費kafka數(shù)據(jù)并通過預定制的專家規(guī)則實現(xiàn)實時的告警判定,最終告警結(jié)果實時通知反饋到告警平臺,實現(xiàn)告警到告警恢復的生命周期。
Part 5 規(guī)則示例
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 "播放成功率告警結(jié)束"
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); 網(wǎng)頁標題:Drools規(guī)則引擎實戰(zhàn)
瀏覽地址:http://www.dlmjj.cn/article/djdcedh.html


咨詢
建站咨詢
