package:對一個規則文件而言,package是必須定義的,必須放在規則文件第一行。特別的是,package的名字是隨意的,不必必須對應物理路徑,跟java的package的概念不同,這裏只是邏輯上的一種區分。
import:導入規則文件需要使用到的外部變量,這裏的使用方法跟java相同,但是不同於java的是,這裏的import導入的不僅僅可以是一個類,也可以是這個類中的某一個可訪問的靜態方法
import:導入規則文件需要使用到的外部變量,這裏的使用方法跟java相同,但是不同於java的是,這裏的import導入的不僅僅可以是一個類,也可以是這個類中的某一個可訪問的靜態方法
rule:定義一個規則。rule "ruleName"。一個規則可以包含三個部分:
屬性部分:定義當前規則執行的一些屬性等,比如是否可被重複執行、過期時間、生效時間等。
條件部分,即LHS,定義當前規則的條件,如 when Message(); 判斷當前workingMemory中是否存在Message對象。
結果部分,即RHS,這裏可以寫普通java代碼,即當前規則條件滿足後執行的操作,可以直接調用Fact對象的方法來操作應用。
no-loop : 是否不允許多次循環執行,默認是false,也就是當前的規則只要滿足條件,可以無限次執行。
import:導入規則文件需要使用到的外部變量,這裏的使用方法跟java相同,但是不同於java的是,這裏的import導入的不僅僅可以是一個類,也可以是這個類中的某一個可訪問的靜態方法
但是其他的規則會被重新執行,豈不是也會有可能造成多次重複執行,數據紊亂甚至死循環?答案是使用其他的標籤限制,也是可以控制的:lock-on-active true
lock-on-active true:通過這個標籤,可以控制當前的規則只會被執行一次,因爲一個規則的重複執行不一定是本身觸發的,也可能是其他規則觸發的,所以這個是no-loop的加強版。當然該標籤正規的用法會有其他的標籤的配合,後續提及。
date-expires:設置規則的過期時間,默認的時間格式:“日-月-年”,中英文格式相同,但是寫法要用各自對應的語言,比如中文:"29-七月-2010",但是還是推薦使用更爲精確和習慣的格式,這需要手動在java代碼中設置當前系統的時間格式,後續提及。屬性用法舉例:date-expires "2011-01-31 23:59:59" // 這裏我們使用了更爲習慣的時間格式
date-effective:設置規則的生效時間,時間格式同上。
duration:規則定時,duration 3000 3秒後執行規則
salience:優先級,數值越大越先執行,這個可以控制規則的執行順序。
其他的屬性可以參照相關的api文檔查看具體用法,此處略。
import:導入規則文件需要使用到的外部變量,這裏的使用方法跟java相同,但是不同於java的是,這裏的import導入的不僅僅可以是一個類,也可以是這個類中的某一個可訪問的靜態方法規則的條件部分,即LHS部分:
when:規則條件開始。條件可以單個,也可以多個,多個條件一次排列,比如
when
eval(true)
$customer:Customer()
$message:Message(status==0)
上述羅列了三個條件,當前規則只有在這三個條件都匹配的時候纔會執行RHS部分,三個條件中第一個
eval(true):是一個默認的api,true 無條件執行,類似於 while(true)
$message:Message(status==0)
import:導入規則文件需要使用到的外部變量,這裏的使用方法跟java相同,但是不同於java的是,這裏的import導入的不僅僅可以是一個類,也可以是這個類中的某一個可訪問的靜態方法contains:對比是否包含操作,操作的被包含目標可以是一個複雜對象也可以是一個簡單的值。
Drools提供了十二中類型比較操作符:
> >= < <= == != contains / not contains / memberOf / not memberOf /matches/ not matches
not contains:與contains相反。
memberOf:判斷某個Fact屬性值是否在某個集合中,與contains不同的是他被比較的對象是一個集合,而contains被比較的對象是單個值或者對象。
not memberOf:正好相反。
matches:正則表達式匹配,與java不同的是,不用考慮'/'的轉義問題
not matches:正好相反。
規則的結果部分
當規則條件滿足,則進入規則結果部分執行,結果部分可以是純java代碼,比如:
then
System.out.println("OK"); //會在控制檯打印出ok
end
當然也可以調用Fact的方法,比如 $message.execute();操作數據庫等等一切操作。
結果部分也有drools提供的方法:
insert:往當前workingMemory中插入一個新的Fact對象,會觸發規則的再次執行,除非使用no-loop限定;
update:更新
modify:修改,與update語法不同,結果都是更新操作
retract:刪除
RHS部分除了調用Drools提供的api和Fact對象的方法,也可以調用規則文件中定義的方法,方法的定義使用 function 關鍵字
function void console {
System.out.println();
StringUtils.getId();// 調用外部靜態方法,StringUtils必須使用import導入,getId()必須是靜態方法
}
Drools還有一個可以定義類的關鍵字:
declare 可以再規則文件中定義一個class,使用起來跟普通java對象相似,你可以在RHS部分中new一個並且使用getter和setter方法去操作其屬性。
declare Address
@author(quzishen) // 元數據,僅用於描述信息
@createTime(2011-1-24)
city : String @maxLengh(100)
postno : int
end
上述的'@'是什麼呢?是元數據定義,用於描述數據的數據~,沒什麼執行含義
你可以在RHS部分中使用Address address = new Address()的方法來定義一個對象。
http://blog.csdn.net/quzishen/article/details/6163012