Drools 規則文件(轉)


轉自https://blog.csdn.net/wo541075754/article/details/75150267

一個標准的規則文件的格式為已“.drl”結尾的文本文件,因此可以通過記事本工具進行編輯。規則放置於規則文件當中,一個規則文件可以放置多條規則。在規則文件當中也可以存放用戶自定義的函數、數據對象及自定義查詢等相關在規則當中可能會用到的一些對象。

4.1 規則文件

從架構角度來講,一般將同一業務的規則放置在同一規則文件,也可以根據不同類型處理操作放置在不同規則文件當中。不建議將所有的規則放置與一個規則文件當中。分開放置,當規則變動時不至於影響到不相干的業務。讀取構建規則的成本業務會相應減少。

標准規則文件的結構如下:

package package-name

imports

globals

functions

queries

rules
1
2
3
4
5
6
7
8
9
10
11
12
package:在一個規則文件當中package是必須的,而且必須放置在文件的第一行。package 的名字是隨意的,不必必須對應物理路徑,這里跟java的package的概念不同,只是邏輯上的區分,但建議與文件路徑一致。同一的package下定義的function和query等可以直接使用。
比如,上面實例中package的定義:

package com.rules
1
import:導入規則文件需要的外部變量,使用方法跟java相同。像java的是import一樣,還可以導入類中的某一個可訪問的靜態方法。(特別注意的是,某些教程中提示import引入靜態方法是不同於java的一方面,可能是作者沒有用過java的靜態方法引入。)另外,目前針對Drools7版本,static和function關鍵字的效果是一樣的。

import static com.secbro.drools.utils.DroolsStringUtils.isEmpty;
import function com.secbro.drools.utils.DroolsStringUtils.isEmpty;
1
2
rules:定義一個條規則。rule “ruleName”。一條規則包含三部分:屬性部分、條件部分和結果部分。rule規則以rule開頭,以end結尾。

屬性部分:定義當前規則執行的一些屬性等,比如是否可被重復執行、過期時間、生效時間等。

條件部分,簡稱LHS,即Left Hand Side。定義當前規則的條件,處於when和then之間。如when Message();判斷當前workingMemory中是否存在Message對象。LHS中,可包含0~n個條件,如果沒有條件,默認為eval(true),也就是始終返回 true。

結果部分,簡稱RHS,即Right Hand Side,處於then和end之間,用於處理滿足條件之后的業務邏輯。可以使用LHS部分定義的變量名、設置的全局變量、或者是直接編寫Java 代碼。

RHS部分可以直接編寫Java代碼,但不建議在代碼當中有條件判斷,如果需要條件判斷,那么需要重新考慮將其放在LHS部分,否則就違背了使用規則的初衷。

RHS部分,提供了一些對當前Working Memory實現快速操作的宏函數或對象,比如 insert/insertLogical、update/modify和retract等。利用這些函數可以實現對當前Working Memory中的Fact對象進行新增、修改或刪除操作;如果還要使用Drools提供的其它方法,可以使用另一個外宏對象drools,通過該對象可以使用更多的方法;同時Drools 還提供了一個名為kcontext的宏對象,可以通過該對象直接訪問當前Working Memory的 KnowledgeRuntime。

標准規則的結構示例:

rule "name"
attributes
when
LHS
then
RHS
end
1
2
3
4
5
6
7
8
LHS為空示例:

rule "name"
when
then
end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM