Drools介紹
標簽: Java
Drools 是用 Java 語言編寫的開放源碼規則引擎,使用 Rete 算法對所編寫的規則求值。Drools 允許使用聲明方式表達業務邏輯。可以使用非 XML 的本地語言編寫規則,從而便于學習和理解。并且,還可以將 Java 代碼直接嵌入到規則文件中,這令 Drools 的學習更加吸引人。
Drools 還具有其他優點:
- 非常活躍的社區支持
- 易用
- 快速的執行速度
- 在 Java 開發人員中流行
- 與 Java Rule Engine API(JSR 94)兼容
Drools 是業務邏輯集成平臺,被分為4個項目:
- Drools Guvnor (BRMS/BPMS):業務規則管理系統
- Drools Expert (rule engine):規則引擎,drools的核心部分
- Drools Flow (process/workflow):工作流引擎
- Drools Fusion (cep/temporal reasoning):事件處理
官網:http://www.drools.org/#
官方文檔:http://www.drools.org/learn/documentation.html
Drools語法
規則文件
規則文件可以使用 .drl文件,也可以是xml文件,這里我們使用drl文件
規則文件
package:對一個規則文件而言,package是必須定義的,必須放在規則文件第一行,package的名字是隨意的,不必必須對應物理路徑,跟java的package的概念不同,這里只是邏輯上的一種區分
如:
package com.sankuai.meituan.waimai.drools.demo
import:導入規則文件需要使用到的外部規則文件或者變量,這里的使用方法跟java相同,但是不同于java的是,這里的import導入的不僅僅可以是一個類,也可以是這個類中的某一個可訪問的靜態方法
import com.drools.demo.point.PointDomain;
rule:定義一個具體規則。rule "ruleName"。一個規則可以包含三個部分:
-
屬性部分:
定義當前規則執行的一些屬性等,比如是否可被重復執行、過期時間、生效時間等。 -
條件部分(LHS):
定義當前規則的條件,如 when Message(); 判斷當前workingMemory中是否存在Message對象。 -
結果部分(RHS):
即當前規則條件滿足后執行的操作,可以直接調用Fact對象的方法來操作應用。這里可以寫普通java代碼
rule部分
rule "ruleName"
no-loop true
when
$message:Message(status == 0)
then
System.out.println("fit");
$message.setStatus(1);
update($message);
end
規則詳情
屬性詳情
-
no-loop:
定義當前的規則是否不允許多次循環執行,默認是false
;當前的規則只要滿足條件,可以無限次執行。什么情況下會出現一條規則執行過一次又被多次重復執行呢?drools提供了一些api,可以對當前傳入workingMemory中的Fact對象進行修改或者個數的增減,比如上述的update方法,就是將當前的workingMemory中的Message類型的Fact對象進行屬性更新,這種操作會觸發規則的重新匹配執行,可以理解為Fact對象更新了,所以規則需要重新匹配一遍,那么疑問是之前規則執行過并且修改過的那些Fact對象的屬性的數據會不會被重置?結果是不會,已經修改過了就不會被重置,update之后,之前的修改都會生效。當然對Fact對象數據的修改并不是一定需要調用update才可以生效,簡單的使用set方法設置就可以完成,這里類似于java的引用調用,所以何時使用update是一個需要仔細考慮的問題,一旦不慎,極有可能會造成規則的死循環。上述的no-loop true,即設置當前的規則,只執行一次,如果本身的RHS部分有update等觸發規則重新執行的操作,也不要再次執行當前規則。
但是其他的規則會被重新執行,豈不是也會有可能造成多次重復執行,數據紊亂甚至死循環?答案是使用其他的標簽限制,也是可以控制的:lock-on-active true -
lock-on-active:lock-on-active true 通過這個標簽,可以控制當前的規則只會被執行一次,因為一個規則的重復執行不一定是本身觸發的,也可能是其他規則觸發的,所以這個是no-loop的加強版
-
date-expires:設置規則的過期時間,默認的時間格式:“日-月-年”
-
date-effective:設置規則的生效時間,時間格式同上。
-
duration:規則定時,duration 3000,3秒后執行規則
-
salience:優先級,數值越大越先執行,這個可以控制規則的執行順序。
**rule attributes**
條件部分- LHS
- when:規則條件開始。條件可以單個,也可以多個,多個條件一次排列
如:當前規則只有在這三個條件都匹配的時候才會執行RHS部分
when
eval(true)
$customer:Customer()
$message:Message(status==0)
-
eval(true):是一個默認的api,true 無條件執行,類似于 while(true)
-
操作符:
>
、>=
、<
、<=
、==
、!=
、contains
、not contains
、memberOf
、not memberOf
、matches
、not matches
操作符
- contains: 對比是否包含操作,操作的被包含目標可以是一個復雜對象也可以是一個簡單的值
Person( fullName not contains "Jr" )
- not contains:與contains相反。
- memberOf:判斷某個Fact屬性值是否在某個集合中,與contains不同的是他被比較的對象是一個集合,而contains被比較的對象是單個值或者對象
CheeseCounter( cheese memberOf $matureCheeses )
- not memberOf:與memberOf正好相反
- matches:正則表達式匹配
Cheese( type matches "(Buffalo)?\\S*Mozarella" )
注意:
就像在Java中,寫為字符串的正則表達式需要轉義“\”
- not matches:與matches正好相反
結果部分- RHS
當規則條件滿足,則進入規則結果部分執行,結果部分可以是純java代碼
- then:
then
System.out.println("OK"); //會在控制臺打印出ok
end
- insert:往當前workingMemory中插入一個新的Fact對象,會觸發規則的再次執行,除非使用no-loop限定
- update:更新
- modify:修改,與update語法不同,結果都是更新操作
- retract:刪除
rule "Rule 03"
when
$number : Number( )
not Number( intValue < $number.intValue )
then
System.out.println("Number found with value: " + $number.intValue() );
retract( $number );
end
Drools關鍵詞
關鍵詞 | 描述 | 詳情 |
---|---|---|
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方法定義
- function
function String hello(String name) {
return "Hello "+name+"!";
}
Drools聲明類型
- declare:聲明類型
- 聲明Class、Enum etc類型
- 聲明元數據
聲明類類型
declare Address
number : int
streetName : String
city : String
end
聲明枚舉類型
declare enum DaysOfWeek
SUN("Sunday"),MON("Monday"),TUE("Tuesday"),WED("Wednesday"),THU("Thursday"),FRI("Friday"),SAT("Saturday");
fullName : String
end
聲明元數據類型
元數據可以被分配給在Drools中幾個不同的結構:
- fact types
- fact attributes
- rules
定義格式:
@metadata_key(metadata_value)
例子:
@author( Bob )
import java.util.Date
declare Person
@author( Bob )
@dateOfCreation*( 01-Feb-2009 )
name : String @key @maxLength*( 30 )
dateOfBirth : Date address : Address
end
聲明元數據類級別 關鍵詞
@role( <fact | event> )
import some.package.StockTick
declare StockTick
@role ( event )
end
@typesafe( <boolean> )
@timestamp( <attribute name> )
declare VoiceCall
@role( event )
@timestamp( callDateTime )
end
-
@duration( <attribute name> )
-
@expires( <time interval> )
-
@propertyChangeSupport
-
@propertyReactive
聲明元數據屬性級別 關鍵詞
@key
兩個方面影響:
根據@key作為類標識符,類比較以 @key 的字段為準
根據@key字段生成構造函數
declare Person
firstName : String @key
lastName : String @key
age : int
end
@position
declare Cheese
name : String @position(1)
shop : String @position(2)
price : int @position(0)
end
設計
Drools vs ILog vs Jess vs Mandarax
優點 | ||
---|---|---|
Drools | 開源、社區非常活躍、易使用、免費、JSR94兼容(JSR94是Java Rule Engine API)、支持Java、強大的工具集 | 只支持一種推理方式、安全性不夠 |
ILog | 性能高(電信領域使用)、易使用 | 商業產品、不開源 |
Jess | 支持2種推理方式(正向鏈和反向鏈)、很強的表示、推理能力、支持AOP | 不開源、無規則管理工具、不易使用 |
Mandarax | 開源、免費、支持Java | JSR94不兼容(JSR94是Java Rule Engine API)、已經不更新、社區不活躍、并且文檔不全 |
推理方式
- 正向鏈推理:一條由問題開始搜索,并得到其解答的鏈稱為正向鏈推理。
- 反向鏈推理:一條由假設回推到支持該假設的事實的鏈稱為反向鏈推理。
智能推薦
【轉載】Drools學習
Drools使用總結 學習自: https://blog.csdn.net/column/details/16183.html?&page=1 什么是Drools Drools是Java編寫的一款開源規則引擎,實現了Rete算法對所編寫的規則求值,支持聲明方式表達業務邏輯。使用DSL(Domain Specific Language)語言來編寫業務規則,使得規則通俗易懂,便于學習理解。支持...
spark drools集成開發
flink 有cep復雜事件處理庫,spark中沒有cep處理庫,如何在spark中實現cep復雜事件處理? 業界普遍使用開源的drools規則引擎集成去處理,cloudera官方博客就有spark 集成drools實現cep處理能力。 項目結構: pom 文件依賴配置: 代碼: 執行測試: spark drools集成測試6.5版本本地,集群模式都可以正常...
Drools入門系列
轉載自:Drools Drools(JBoss Rules )具有一個易于訪問企業策略、易于調整以及易于管理的開源業務規則引擎,符合業內標準,速度快、效率高。業務分析師或審核人員可以利用它輕松查看業務規則,從而檢驗是否已編碼的規則執行了所需的業務規則。Drools是為Java量身定制的基于Charles Forgy的RETE算法的規則引擎的實現。具有了OO接口的RETE,使得商業規則有了更自然的表...
規則引擎-Drools
Drools規則引擎 KIE KIE是一個分組的名字,囊括了多個工程。可以用于多個工程同一構建,部署和運用。 Drools是一個業務規則管理系統,具有前向鏈接和后向鏈接的基于推理的規則引擎,允許快速可靠地評估業務規則和復雜的事件處理。規則引擎也是創建專家系統的基本構件,在人工智能中,專家系統是模擬人類專家決策能力的計算機系統。 OptaPlanner是一個本地搜索和優化工具,它是從Drools P...
規則引擎——Drools
Drools簡介 Drools使用范例 語法介紹 名詞解釋 Drools簡介 JBoss Rules 的前身是Codehaus的一個開源項目叫Drools。最近被納入JBoss門下,更名為JBoss Rules,成為了JBoss應用服務器的規則引擎。 Drools是為Java量身定制的基于Charles Forgy的RETE算法的規則引擎的實現。具有...
猜你喜歡
drools 規則引擎
@woshiqiuxiaoyan 源碼git 創建規則客戶端,編寫使用規則 在服務端編寫drl文件 轉自:https://blog.csdn.net/woshiqiuxiaoyan...
3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習
3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 自學資源 作業內容 1、基本操作演練【建議做】 天空盒的制作: 地圖的制作: 整體效果: 2、編程實踐 項目要求: 項目結構: 代碼詳解: Actions: ISSActionCallback.cs SSAction.cs SSAction...
FlycoTabLayout 的使用
FlycoTabLayout 一個Android TabLayout庫,目前有3個TabLayout SlidingTabLayout:參照PagerSlidingTabStrip進行大量修改. 新增部分屬性 新增支持多種Indicator顯示器 新增支持未讀消息顯示 新增方法for懶癌患者 CommonTabLayout:不同于SlidingTabLayout對ViewPager依賴,它是一個不...
爬蟲項目實戰八:爬取天氣情況
爬取天氣情況 目標 項目準備 接口分析 代碼實現 效果顯示 寫入本地 目標 根據天氣接口,爬取接下來一周的天氣情況。 項目準備 軟件:Pycharm 第三方庫:requests,BeautifulSoup,csv 接口地址:http://api.k780.com:88/?app=weather.future&weaid=城市名&appkey=10003&sign=b59bc...
關于web項目的目錄問題
先給段代碼: 上面這個代碼一直出錯,我不知道原因,后面不停的查找資料發現了問題:我的web項目輸出目錄有問題,因為我也是第一次用idea寫web項目,發現很多bug 其實都沒有太大問題,我們需要注意的是你必須在out這個輸出文件夾中擁有這個文件,out輸出文件夾會默認過濾這些文件...