一、規則檔案構成
package(規則檔案所在包)
import(導入java包)
global(規則檔案中的"全局變量")
function(函數)
query(查找)
rule(規則)
二、重點部分介紹
1、rule
1 rule "Rule Name"2 屬性名稱 屬性值3 when4 條件5 then6 行為7 end
以下為在規則中使用的常用屬性及其描述:
1)agenda-group:為規則設定所屬的規則組,當規則組獲得焦點時,會比對組内的規則,如果規則組沒有獲得焦點,那麼組内的規則将不會被觸發。
該屬性預設為MAIN。
2)salience:優先級,數值越大越先執行,這個可以控制規則的執行順序。從0開始,即0優先級最小。
2、import
導入規則檔案需要使用到的外部變量
不僅僅可以是一個類,也可以是這個類中的某一個可通路的靜态方法
1)導入類
2)導入Java類的靜态方法
import function 類名.靜态方法名
當調用該靜态方法時,使用eval()。括号内寫"方法名(參數)"。eval(true)參數為布爾值。類似于 while(true)。
三、十二中類型比較操作符
> >=
四、規則的條件部分LHS(Left Hand Side)
1、
when:規則條件開始。條件可以單個,也可以多個,多個條件一次排列,比如
when
eval(true)
$customer:Customer()
$message:Message(status==0)
上述羅列了三個條件,目前規則隻有在這三個條件都比對的時候才會執行RHS部分,三個條件中第一個
eval(true):是一個預設的api,true 無條件執行,類似于 while(true)
$message:Message(status==0) 這句話标示的:目前的workingMemory存在Message類型并且status屬性的值為0的Fact對象,這個對象通常是通過外部java代碼插入或者自己在前面已經執行的規則的RHS部分中insert進去的。
前面的$message代表着目前條件的引用變量,在後續的條件部分和RHS部分中,可以使用目前的變量去引用符合條件的FACT對象,修改屬性或者調用方法等。可選,如果不需要使用,則可以不寫。
2、對Fact對象private屬性的操作可以使用getter和setter方法或.+屬性名。
3、如果條件全部是 &&關系,可以使用“,”來替代,但是兩者不能混用。
如:$customer :Customer(name == "john", age > 20)
五、規則的結果部分RHS(Right Hand Side)
1、當規則條件滿足,則進入規則結果部分執行,結果部分可以是純java代碼。
下面的内容摘抄自http://kingsun1980.iteye.com/blog/459272/,感謝部落客的分享!
六、函數Functions
function可以在規則檔案中定義,但更多的是使用外部類中定義的static方法,這樣隻要Java中可以實作的邏輯,在規則中都可以做為function調用。
七、方言dialect
在規則表達式中可以使用方言來簡化表達式,使之更加具有可讀性。
Drools方言預設的是Java,Drools也支援mvel。
mvel是一種基于Java應用程式的表達式語言,它支援屬性和方法的直接通路。
八、規則的條件部分
1、目前本人正在使用的兩個表達式是eval表達式和内置eval表達式
如:
eval表達式
$account : Account()
eval(accountService.isUniqueAccountNumber($account))
内置eval表達式
$customer1 : Customer()
Customer(eval(age == $customer1.getAge() + 10))