天天看點

drools規則拼接_Drools規則檔案結構說明

一、規則檔案構成

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))