4.規則集

概述

規則集也叫決策集,在URule Pro當中(zhōng)是由一組普通規則和循環規則構成的規則集合,是使用(yòng)頻率最高的一種業務(wù)規則實現方式。

在URule Pro中(zhōng)規則有(yǒu)兩種類型:一種是普通規則;一種是循環規則。所謂的普通規則是指一種由如果、那麽、否則三個部分(fēn)構成的規則;而循環規則顧名(míng)思義就是可(kě)循環的規則,它允許指定一個集合類型的對象,對這個集合中(zhōng)每個對象進行循環叠代,在循環體(tǐ)中(zhōng)則是若幹個由如果、那麽、否則構成的普通規則。

在定義方式上,URule Pro提供了向導式規則集以及腳本式規則集定義兩種。

所謂向導式規則集是指利用(yòng)引擎提供的設計器,一步一步通過鼠标點擊就可(kě)以完成其中(zhōng)的普通規則與循環規則的配置,配合高度可(kě)視化的向導式規則設計器,可(kě)以最大限度将業務(wù)規則可(kě)視化,降低規則配置的複雜度;而腳本式規則集顧名(míng)思義就是通過在規則集文(wén)件當中(zhōng)按URule Pro的腳本語法規範來書寫腳本實現普通規則與循環規則的定義工(gōng)作(zuò)。

向導式規則集因為(wèi)是图形化,向導方式構建規則,所以适合業務(wù)人員使用(yòng);而腳本式規則集通過書寫腳本構成規則,與傳統代碼編寫類似,所以适合技(jì )術人員來編寫規則;從功能(néng)上看,向導式規則集和腳本式規則集能(néng)實現的功能(néng)是完全相同的,也就是說向導式規則集中(zhōng)能(néng)實現的功能(néng)在腳本式規則集也完全可(kě)以實現,反之亦然。

在URule Pro當中(zhōng),雖然說腳本式規則能(néng)實現向導式規則中(zhōng)提供的所有(yǒu)功能(néng),但我們還是推薦大家采用(yòng)向導式規則集文(wén)件來定義我們的業務(wù)規則,原因很(hěn)簡單,向導式規則構建規則方式是可(kě)視化的,構建好的規則可(kě)讀性更好,這樣構建業務(wù)規則中(zhōng)出錯的機率就會更小(xiǎo)。

打開一個URule Pro的項目,在“決策集”節點右鍵選擇創建一個向導式決策集文(wén)件,創建好的文(wén)件通過URule Pro向導式決策集設計器打開後的效果如下:

在向導式決策集的設計器中(zhōng),通過頂部的工(gōng)具(jù)欄,點擊“添加規則”按鈕可(kě)以添加一個普通的由如果、那麽、否則構成的普通規則;點擊“添加循環規則”按鈕可(kě)以添加一個可(kě)以循環的規則。之前介紹的變量、常量、參數、動作(zuò)四種類型的庫文(wén)件,在向導式規則裏就可(kě)以導入使用(yòng)了。

普通規則

點擊“添加規則”按鈕就在下面的工(gōng)作(zuò)區(qū)裏添加了一個普通的規則,如下图所示:

一個普通規則主體(tǐ)是由如果、那麽、否則構成,點擊規則名(míng)可(kě)以對規則名(míng)進行修改,修改完成後鼠标點擊頁(yè)簽處離開焦點就完成了規則名(míng)的修改确認;點擊“添加屬性”鏈接可(kě)以為(wèi)當前規則定義相關屬性。無論是普通規則還是循環規則都支持下面這些屬性。

中(zhōng)文(wén)屬性名(míng) 英文(wén)屬性名(míng) 值類型 描述
優先級 salience 數字 當有(yǒu)多(duō)個規則滿足條件時,這個值用(yòng)來決定這些滿足條件規則中(zhōng)動作(zuò)的執行順序,值越大,執行順序越靠前。如不設置這個值,那按條件滿足的順序執行,也就是說如果不配置優先級屬性規則的執行順序是不确定的。
生效日期 effective-date 字符串 當規則設置了生效日期,表示這個規則隻有(yǒu)在當前系統日期為(wèi)大于等于生效日期時才會生效,否則即使條件滿足也不會觸發當前規則,如不設置,則不會對規則執行産(chǎn)生影響。該屬性的值要求是一個日期格式的字符串,格式為(wèi):yyyy-MM-dd HH:mm:ss
失效日期 expires-date 字符串 與生效日期對應,當規則設置失效日期時,一旦當前系統日期大于或等于失效日期,即使條件滿足規則也不會觸發執行,如不設置,則不會對規則執行産(chǎn)生影響。屬性的值要求是一個日期格式的字符串,格式為(wèi):yyyy-MM-dd HH:mm:ss
是否啓用(yòng) enabled 布爾值 默認值為(wèi)true,也就是啓用(yòng)當前規則;如設置為(wèi)false,即使條件滿足規則也不會觸發執行,如不設置,則不會對規則執行産(chǎn)生影響。
允許調試信息輸出 debug 布爾值 默認為(wèi)false,表示不輸出調試信息,設置為(wèi)true後,規則在執行時會在控制台輸出規則條件的匹配信息、規則動作(zuò)的執行信息;如果規則計算過程出現異常,還會在控制台輸出計算出現異常的位置,以便于我們快速定義規則錯誤位置。需要注意的是,如果項目的urule.debug屬性設置為(wèi)false時,規則的這個屬性會被覆蓋,也就是說即使設置為(wèi)true也不會輸出任何信息。
互斥組 mutex-group 字符串 系統會自動将此屬性相同的規則劃為(wèi)一組,且這個組中(zhōng)隻有(yǒu)一個規則會執行,待執行的規則如設置了優先級,則優先級最高的規則執行,否則随機;需要注意的是,互斥組屬性僅在當前規則集文(wén)件默認模式下有(yǒu)用(yòng),在順序模式下互斥組屬性将不起作(zuò)用(yòng)。
執行組 pended-group 字符串 系統會自動将此屬性相同的規則劃為(wèi)一組,默認情況下,引擎不會執行這個組裏的規則,需要我們在定義規則動作(zuò)時利用(yòng)系統内置的函數顯示的指定要激活執行的執行組名(míng),這樣系統才會嘗試匹配并執行組裏的規則。
允許循環觸發 loop 布爾值 當執行“更新(xīn)工(gōng)作(zuò)區(qū)對象”動作(zuò)時,某些規則可(kě)以會再次滿足條件,這時這個屬性就是用(yòng)來決定這種類型的規則是否允許再次觸發執行。關于“更新(xīn)工(gōng)作(zuò)區(qū)對象”請參考“更新(xīn)工(gōng)作(zuò)區(qū)“章節介紹

在使用(yòng)過程當中(zhōng),如果一個規則配置了執行組,也配置了互斥組屬性,那麽這個規則對應的執行組屬性被激活後,其中(zhōng)配置了互斥組屬性的規則将按互斥組屬性執行原則執行。

在向導式規則文(wén)件工(gōng)具(jù)欄上名(míng)為(wèi)配置的按鈕菜單下有(yǒu)一個用(yòng)于控制當前文(wén)件中(zhōng)所有(yǒu)向導式規則日志(zhì)輸出的開關按鈕,它的默認狀态為(wèi)“禁用(yòng)調試日志(zhì)輸出”,如果我們希望打開當前文(wén)件中(zhōng)所有(yǒu)向導式規則的日志(zhì)輸出功能(néng),那麽隻需要在這裏 将“禁用(yòng)調試日志(zhì)輸出”改為(wèi)“允許調試日志(zhì)輸出”即可(kě)。

規則名(míng)及屬性定義完成後,接下來就可(kě)以開始配置規則的主體(tǐ)部分(fēn),首先是“如果”部分(fēn),在如果部分(fēn)當中(zhōng)可(kě)以添加若幹條件,添加完條件後,就可(kě)以通過鼠标點擊以向導方式設置條件,如下图:

對于一個具(jù)體(tǐ)的條件來說,我們可(kě)以将其分(fēn)為(wèi)三個部分(fēn),分(fēn)别是條件左邊部分(fēn)、比較操作(zuò)符以及條件右邊部分(fēn)。條件左邊部分(fēn),如上图所示我們可(kě)選擇的有(yǒu)變量、參數或者方法或函數,當然這相應的需要我們導入相關的變量庫、參數庫以及方法庫;對于操作(zuò)符目前URule Pro當中(zhōng)提供了下面這些操作(zuò)比較符,如下图所示:

這些操作(zuò)比較符基本已涵蓋我們業務(wù)當中(zhōng)所有(yǒu)類型的比較操作(zuò)。

大部分(fēn)的比較操作(zuò)符比較簡單,這裏挑幾個看起來複雜一些的比較操作(zuò)符介紹一下使用(yòng)方式:

比較操作(zuò)符名(míng)稱 描述
在集合中(zhōng) 判斷條件左值是不是在條件右值的對應的集合當中(zhōng),條件右值可(kě)以是一個Collection類型的集合對象,也可(kě)以是一個由,分(fēn)隔的字符串,比如aaa,bbb,ccc
不在集合中(zhōng) 用(yòng)法與“在集合中(zhōng)”剛好相反
匹配正則表達式 要求條件右值是一個标準的正則表達式,這裏需要指出的是條件中(zhōng)采用(yòng)的正則匹配方式是字符串全匹配方式,不是部分(fēn)匹配方式。比如條件左值為(wèi)字符串“我是中(zhōng)国人”,條件右值中(zhōng)輸入字符串“中(zhōng)国”,運行時你會發現條件無法滿足,這是因為(wèi)條件右值中(zhōng)隻是部分(fēn)匹配條件左值,改成“.*中(zhōng)国.*”後即變成全字符串匹配,表示左值中(zhōng)隻要包含“中(zhōng)国”字符串即可(kě)以匹配,具(jù)體(tǐ)使用(yòng)大家可(kě)參照标準的正則表達式語法
不匹配正則表達式 與“匹配正則表達式”作(zuò)用(yòng)相反
在區(qū)間值中(zhōng) 要求條件右值是一個由,分(fēn)隔的兩個值,目前支持數字和日期兩種類型,如:“30,40”表示條件左值大于等于30且小(xiǎo)于等于40,如果條件左值是個日期,那麽條件右值可(kě)以寫成這樣:“2010-12-11,2020-12-11”,那就表示左值的日期要大于等于2010-12-11,同時要小(xiǎo)于等于2020-12-11(日期格式支持yyyy-MM-dd或yyyy-MM-dd HH:mm:ss兩種類型);定義區(qū)間值時還可(kě)以使用(yòng)[]和()來确定是否包含起始值,其中(zhōng)[]是包含起始值,與直接寫區(qū)間值效果相同,()為(wèi)不包含區(qū)間值。比如[30,40)表示條件左值大于等于30,同時小(xiǎo)于40;比如(30,40)表示大于30,且小(xiǎo)于40。[]和()符号用(yòng)在日期區(qū)間上也能(néng)起到同樣的效果
不在區(qū)間值中(zhōng) 與“在區(qū)間值中(zhōng)”作(zuò)用(yòng)相反

選擇完比較操作(zuò)符後,我們就可(kě)以來設置條件右邊部分(fēn)。條件右邊部分(fēn)相比左邊,可(kě)選擇的值類型會更多(duō)一些,如下图:

一旦選擇某種類型值之後,我們就可(kě)以進入下一步操作(zuò),同時在URule Pro當中(zhōng)無論條件左值還是條件右值都可(kě)以進行無限多(duō)級簡單的加、減、乘、除運算操作(zuò),如下图所示:

在配置條件時,需要我們把之前定義好的變量庫文(wén)件、參數庫文(wén)件、常量庫文(wén)件、動作(zuò)庫文(wén)件導入進來。對于條件來說,可(kě)以是多(duō)個條件,也可(kě)以是多(duō)個複合條件組合,這樣都是通過鼠标點擊操作(zuò)完成,這裏就不再贅述。

條件配置完成後,可(kě)以為(wèi)“那麽”或“否則”部分(fēn)添加動作(zuò),那麽部分(fēn)的動作(zuò)隻有(yǒu)條件滿足時執行,反之,否則部分(fēn)的動作(zuò)隻在條件不滿足時執行,不加動作(zuò)意味着什麽也不幹,動作(zuò)可(kě)以有(yǒu)多(duō)個,多(duō)個動作(zuò)添加完成後可(kě)以通過拖曳改變順序。

目前在URule Pro當中(zhōng)支持的動作(zuò)類型有(yǒu)三種,分(fēn)别是:打印内容到控制台、變量賦值以及執行方法或函數,如下图所示:

打印内容到控制台其實就是将我們需要的信息打印輸出到日志(zhì)當中(zhōng),内容可(kě)以是一個普通的輸入值,也可(kě)以是一些複雜的值類型或它們的加、減、乘、除組合,及添加括号定義算術運行優先級;在規則配置好“允許日志(zhì)輸出”選項時,就可(kě)以看到這個動作(zuò)對應的輸出内容。

變量賦值也就是給當前導入的變量庫或參數庫的值進行賦值,值類型可(kě)以是一個普通的輸入值,也可(kě)以是一些複雜的值類型或它們的加、減、乘、除組合,及添加括号定義算術運行優先級。

在變量賦值操作(zuò)裏,如果賦值對象的屬性是一個對象類型,賦值時可(kě)以直接寫個JSON為(wèi)這個對象的部分(fēn)屬性進行賦值。

如Employee對象有(yǒu)個名(míng)為(wèi)company的屬性,該屬性是個對象類型,對應的Company對象有(yǒu)四個字段,分(fēn)别是id,name,address,post,那麽在進行變量賦值操作(zuò)時,如果想一次性為(wèi)這個company屬性的id,name,post三個屬性賦值,我們可(kě)以寫下面這樣的JSON值:

{"id":"bstek","name":"銳道","post":1000815}

将上面的JSON值賦給這個company屬性,JSON中(zhōng)的id,name,post三個屬性值将會被寫到company對象中(zhōng)的id,name,post三個對應子屬性當中(zhōng)。

最後一種類型的動作(zuò)是執行方法或函數,要選擇執行的方法或函數,前提是我們必須方法所在的動作(zuò)庫文(wén)件導入到當前規則文(wén)件當中(zhōng),否則就看不到要執行的方法,一旦選擇執行方法後,如果當前方法當中(zhōng)包含參數,那麽我們也需要選擇相應的值為(wèi)參數賦值,同樣參數的值可(kě)以是一個普通的輸入值,也可(kě)以是一些複雜的值類型或它們的加、減、乘、除組合。動作(zuò)的具(jù)體(tǐ)配置都是基于鼠标點擊操作(zuò)的,比較簡單,這裏不再贅述。

在向導式規則編輯器中(zhōng),可(kě)以通過鼠标拖曳來改變那麽或否則部分(fēn)的動作(zuò)順序,同時,對于多(duō)個規則文(wén)件,也可(kě)以通過拖曳來改變它們的顯示順序。

示例

下面是一個包含兩個普通規則的決策集文(wén)件,導入了我們之前配置的那個包含Customer的變量庫文(wén)件,在第一個規則當中(zhōng)條件滿足時執行兩個動作(zuò),不滿足執行一個動作(zuò);第二個規則條件滿足的話執行兩個動作(zuò),不滿足什麽也不做,如下图所示:

可(kě)以看到這兩個規則條件都比較簡單,并且他(tā)們是互斥的,同一時刻最多(duō)隻會滿足一個規則。

接下來需要對這個決策集進行測試,測試方法比較簡單,我們可(kě)以直接點擊當前規則文(wén)件工(gōng)具(jù)欄上的“測試”按鈕針對當前文(wén)件進行快速測試, 也可(kě)以點擊項目的“知識包”節點,在打開的編輯器中(zhōng)添加一個知識包,并将這個做好的規則集文(wén)件放到這個包中(zhōng)進行打包測試,如下图所示:

知識包是URule Pro中(zhōng)提供的一種用(yòng)于将一個或多(duō)個規則集、決策表、交叉決策表、決策樹、評分(fēn)卡、複雜評分(fēn)卡、評分(fēn)流文(wén)件打包的工(gōng)具(jù),知識包的編碼屬性比較重要,是這個包在當前項目中(zhōng)的ID。 定義好知識包及這個包中(zhōng)包含的資源文(wén)件後,可(kě)以點擊知識包菜單項中(zhōng)的“快速測試”按鈕對當前知識包進行測試,如下图所示。

快速測試是URule Pro當中(zhōng)提供的一種針對知識包的測試工(gōng)具(jù),通過它可(kě)對定義好的知識包預先進行測試。 快速測試中(zhōng),我們可(kě)以把相關的輸入選擇并添加進來,輸入需要的值,同時把關注的輸出選擇好,這樣就可(kě)以點擊工(gōng)具(jù)欄上的測試按鈕對當前知識包中(zhōng)的規則文(wén)件或規則流文(wén)件進行測試(如果當前知識包中(zhōng)含有(yǒu)規則流, 那麽點擊測試按鈕時就會開啓這個規則流,如果有(yǒu)多(duō)個規則流,這裏也隻會觸發一個;如果沒有(yǒu)規則流,那麽就觸發知識包裏的所有(yǒu)規則文(wén)件裏的規則)。

實際上,如果我們需要對單個規則文(wén)件進行快速測試,那麽可(kě)以直接在相關的規則文(wén)件中(zhōng)完成,不需要把規則文(wén)件加到知識包中(zhōng)進行, 方法上點擊規則文(wén)件工(gōng)具(jù)欄上的“快速測試”按鈕即可(kě)彈出針對當前規則文(wén)件的快速測試窗口(向導式規則文(wén)件、評分(fēn)卡、決策表、決策流等文(wén)件裏都在工(gōng)具(jù)欄裏提供了快速測試的按鈕)。

測試窗口中(zhōng)的“查看規則樹”按鈕是用(yòng)來通過图形化展示當前知識包所對應的規則樹結構,如上面的示例,點示此按鈕看到的規則樹效果如下:

可(kě)以看到,在這棵樹中(zhōng),把規則定義用(yòng)到的所有(yǒu)條件節點都以樹節點的形式表現出來,條件之間如果是并且關系,那麽這些條件節點在樹中(zhōng)就以串行的形式連接,這樣在實際執行時隻有(yǒu)前一個節點條件滿足才會流轉到下一節點;條件之間如果是或者關系,可(kě)以看到規則樹會通過一個"OR"節點将若幹個條件節點連接,這樣在實際執行時,隻要有(yǒu)一邊連線(xiàn)到達這個“OR”節點,那麽與這個“OR”節點連接的其它連線(xiàn)上的條件節點就不再計算;如果總的條件使用(yòng)并且連接,但分(fēn)支上有(yǒu)并且和或者連接的條件,那麽在構建規則樹時就會将分(fēn)支上的并且條件以串行的形式連接,同時将分(fēn)支上的或者條件使用(yòng)“OR”節點連接,最後再使用(yòng)“AND”節點将所有(yǒu)條件連接起來,如上图所示。

如果規則中(zhōng)有(yǒu)兩個相同的條件,那麽在構建規則樹時會智能(néng)地将這些相同節點合并為(wèi)一個節點,這樣在樹上隻會顯示一個節點,通過這種相同條件節點的共享機制可(kě)以減小(xiǎo)規則樹尺寸,從而減少内存占用(yòng)。

樹的最底端,就是具(jù)體(tǐ)的規則名(míng)。在規則樹運行時,所有(yǒu)的業務(wù)對象通過頂端名(míng)為(wèi)入口的節點插入到規則樹,根據連線(xiàn)評估條件節點是否滿足,如果能(néng)到達最底端規則節點, 則說明與當前規則相關的所有(yǒu)條件滿足,對應規則裏定義的動作(zuò)就進入待執行狀态。

利用(yòng)樹的特點,再配合相關的短路計算方式,可(kě)以最大程度上保證規則條件計算性能(néng),減少不必要的條件匹配嘗試,從而使得規則的計算性能(néng)可(kě)以與普通硬編碼相媲美,實現業務(wù)計算的毫秒(miǎo)級響應。

循環規則

循環規則,它是一種可(kě)以對集合對象進行循環執行的規則。

循環規則它的名(míng)稱與屬性與普通規則一樣,定義循環規則,首先需要定義它的“循環對象”屬性,它要求我們指定一個集合類型的對象,目前URule Pro提供了兩種類型的集合對象來源:一種是指定的集合對象, 這個對象可(kě)以是個參數或變量;另一種是指定類型的所有(yǒu)變量對象,選擇這種類型後,當我們選擇某個變量時,運行時引擎會自動從當前工(gōng)作(zuò)區(qū)中(zhōng)找到所有(yǒu)這種類型的變量并組裝(zhuāng)成一個集合返回; 循環規則在運行時會将這裏選擇的集合對象進行叠代。

接下來定義“開始前動作(zuò)”屬性,顧名(míng)思義,就是在循環規則執行前做的一些動作(zuò),也可(kě)以理(lǐ)解為(wèi)對集合對象進行叠代前要執行的動作(zuò);通常我們會在這個地方做一些初始化的動作(zuò),比如臨時參數的初始化賦值等, 同樣這裏的動作(zuò)可(kě)以是0~n個,如果不定義那麽就不執行。

開始前動作(zuò)定義完成後就可(kě)以定義循環規則的循環單元部分(fēn),對于一個循環規則來說可(kě)以有(yǒu)一個或多(duō)個循環單元,每個循環單元都是一個普通規則的規則體(tǐ),也就是一個由如果、那麽、否則三部分(fēn)構成的普通,定義方式與普通規則完全相同。

在循環規則執行時,每叠代一次“循環對象”,就會将當前叠代的對象插入到工(gōng)作(zuò)區(qū),嘗試匹配循環單元裏的每一個規則體(tǐ),如果滿足條件就執行。

最後是“結束後動作(zuò)”部分(fēn),它在循環執行完成後執行,動作(zuò)可(kě)以是0~n個,不定義就不執行。

在決策集設計器中(zhōng),點擊工(gōng)具(jù)欄上的“添加循環規則”按鈕就可(kě)以添加一個循環規則,如下图所示:

我們來看一個例子,通過這個例子來學(xué)習循環規則的使用(yòng)方法。

示例

我們要實際的業務(wù)是統計用(yòng)戶對象裏訂單金額小(xiǎo)于1000的數量以及訂單金額大于等于1000的數量。

首先我們需要在Customer實體(tǐ)類裏添加一個新(xīn)的屬性orders,如下代碼所示:

@Label("訂單")
private List<Order> orders;

Order類源碼如下:

package com.bstek.entity;
import com.bstek.urule.model.Label;
/**
 * @author Jacky.gao
 * @since 2016年9月30日
 */
public class Order {
    @Label("名(míng)稱")
    private String name;
    @Label("價格")
    private float price;
    @Label("數量")
    private int amount;
    //省略getter和setter方法
}

打開我們的customer變量庫文(wén)件,在"會員"分(fēn)類下添加orders變量,同時将新(xīn)的Order對象添加到庫中(zhōng),如下图:

這樣,“會員”與“訂單”之間就形成了一個一對多(duō)的關系。接下來我們需要利用(yòng)循環規則實現一個簡單的小(xiǎo)需求,那就是統計當前會員的符合條件的訂單價格的總額, 我們目前定義的兩個BOM對象中(zhōng),沒有(yǒu)哪個屬性可(kě)用(yòng)于存儲訂單數量,所以需要添加兩個臨時的參數值,用(yòng)來存儲小(xiǎo)于1000的訂單數和大于或等于1000的訂單數,如下图所示。

庫文(wén)件準備好了之後,接下來我們就可(kě)以來定義一個循環規則來實現統計總價的需求了,定義好的規則如下:

我們定義的這個循環規則中(zhōng),循環對象類型為(wèi)指定的集合對象,這裏指定對會員對象的訂單屬性進行循環; 循環體(tǐ)中(zhōng)有(yǒu)循環單元,分(fēn)别用(yòng)于統計金額小(xiǎo)于1000的訂單數量和金額大于或等于1000的訂單數量;最後在循環結束後的動作(zuò)裏添加了将兩個統計數量的參數輸出到控制台的動作(zuò)。

要測試這個循環規則我們可(kě)以在“知識包”節點,添加這個包含循環規則的決策集文(wén)件,然後針對這個知識包進行快速測試;當然也可(kě)以在這個規則文(wén)件裏點工(gōng)具(jù)欄上的快速測試按鈕對這個循環規則進行測試, 測試方法是一樣的。

點擊規則文(wén)件工(gōng)具(jù)欄上的“快速測試”按鈕,添加一個會員對象作(zuò)為(wèi)輸入,并選擇其下的訂單屬性,并構造訂單的JSON格式數據,如下图所示:

在上图當中(zhōng),測試時,我們構造的訂單數據共有(yǒu)三條,以标準的JSON格式呈現, 關于URule Pro測試時所需要的JSON格式詳細描述,見知識包測試介紹,這裏不再贅述。

點擊“開始測試按鈕”,就完成了訂單總計統計功能(néng),點擊日志(zhì)輸出鏈接,就可(kě)以看到規則執行信息,如下图所示:

從上图的日志(zhì)結果可(kě)以看出,規則已正确計算出訂單數量。

在循環規則當中(zhōng),有(yǒu)些時候我們可(kě)能(néng)需要從子對象中(zhōng)找出一個符合條件的就可(kě)以了,這樣後面的就不需要循環了,針對這種情況, URule裏還提供了一個名(míng)為(wèi)“跳出循環”的方法,我們隻需要在循環規則體(tǐ)的那麽中(zhōng)添加這個方法即可(kě),如下图所示:

在我們這裏的循環規則中(zhōng),針對用(yòng)于統計數量的兩個參數,在循環規則開始前并沒有(yǒu)對它們進行了初始化,這是因為(wèi)在URule Pro當中(zhōng),對于參數的值引擎默認會進行初始化,比如Integer類型的參數它的默認值就是0, 下表中(zhōng)羅列了參數中(zhōng)會被引擎初始化的數據類型的默認值。

數量類型 初始化後的默認值
Integer 0
Long 0
Double 0
Float 0
Boolean false
List 一個不含任何元素的ArrayList對象
Set 一個不含任何元素的HashSet對象
Map 一個不含任何元素的HashMap對象

規則集中(zhōng)提供了規則模版導入功能(néng)。在業務(wù)規則的編寫過程中(zhōng),可(kě)能(néng)存在一些功能(néng)類似的普通規則或循環規則,比如某些規則隻是條件部分(fēn)有(yǒu)一點變化, 或者動作(zuò)部分(fēn)不太一樣,其它都是相同的,對于這種類型的我們沒有(yǒu)必要再重新(xīn)定義一次,隻需要把功能(néng)類似的普通規則或循環規則保存為(wèi)模版,然後在需要時将其導入即可(kě)。利用(yòng)這種特性可(kě)以大大提高業務(wù)規則的定義效率,節省開發時間。

在規則集中(zhōng),每個普通規則和循環規則名(míng)前都有(yǒu)一個複選框,我們可(kě)以根據需要勾選後點擊工(gōng)具(jù)欄上的“保存為(wèi)模版按鈕”,如下图所示:

在彈出的窗口中(zhōng)輸入模版名(míng)稱及相關備注信息後即可(kě),如果當前沒有(yǒu)模版分(fēn)類可(kě)以先創建一個分(fēn)類(模版分(fēn)類是為(wèi)了更好的管理(lǐ)規則模版),然後選中(zhōng)後即可(kě)保存。

有(yǒu)了規則模版後,接下來就可(kě)以打開需要導入模版的規則集文(wén)件,選擇工(gōng)具(jù)欄上的“從模版導入”按鈕,就可(kě)以将選擇的規則模版導入到當前規則集文(wén)件中(zhōng)。

規則模版的适用(yòng)範围是當前項目,也就是說當前項目中(zhōng)定義的模版在當前項目中(zhōng)的任何一個規則集文(wén)件中(zhōng)都可(kě)以導入使用(yòng),有(yǒu)了規則模版可(kě)大幅減少重複勞動,提高開發效率。

對象名(míng)與屬性名(míng)的分(fēn)隔

從2.1.1版本開始,在向導式規則中(zhōng)引用(yòng)變量或常量時,分(fēn)類名(míng)與具(jù)體(tǐ)屬性名(míng)之間的分(fēn)隔符支持用(yòng)戶自定義,其中(zhōng)變量默認為(wèi)“的”;常量默認為(wèi)空(分(fēn)隔符為(wèi)空時常量隻顯示常量值而不顯示分(fēn)類),如下图所示:

在使用(yòng)過程中(zhōng),如果覺得默認提供的分(fēn)隔方式看起來不滿足要求,那麽可(kě)以通過修改下面兩個屬性來實現對變量以及常量分(fēn)隔符的自定義功能(néng):

屬性名(míng) 默認值 描述
urule.variable.link 用(yòng)于定義向導式規則中(zhōng)變量分(fēn)類與屬性之間的分(fēn)隔符
urule.constant.link 用(yòng)于定義向導式規則中(zhōng)常量分(fēn)類與屬性之間的分(fēn)隔符,因為(wèi)該屬性默認值為(wèi)空,所以我們看到默認向導式規則中(zhōng)常量不顯示分(fēn)類,隻顯示值,如果給該屬性定義具(jù)體(tǐ)值,那麽常量的分(fēn)類就會顯示出來

條件模版

從2.1.9版本開始,可(kě)以在“規則集”分(fēn)類中(zhōng)創建“條件模版”文(wén)件,條件模版的作(zuò)用(yòng)就是把一些通用(yòng)條件進行歸類,并定義好有(yǒu)意義的名(míng)稱,這樣在向導式的規則集文(wén)件裏就可(kě)以引用(yòng)條件模版文(wén)件并在規則條件中(zhōng)使用(yòng)條件模版,一個創建好的條件模版文(wén)件效果如下图所示:

條件模版創建完成後,就可(kě)以在向導式規則文(wén)件裏引用(yòng)并使用(yòng)了,引用(yòng)方式與導入庫文(wén)件的方法一緻,點擊工(gōng)具(jù)欄上的“模版”按鈕,選擇其下的“條件模版”菜單項,然後選擇并添加相應的條件模版文(wén)件即可(kě),如下图所示:

使用(yòng)導入的條件模版,隻需要在規則條件裏選擇“添加條件模版”即可(kě),如下图所示:

從2.1.9版本開始,對于向導式規則,在規則名(míng)邊,還添加了一個可(kě)以用(yòng)于直接查看當前規則在編譯後條件樹的按鈕,這對于采用(yòng)了條件模版的規則來說非常有(yǒu)意義,通過查看編譯後的條件樹,就可(kě)以明确在添加了條件模版後對當前規則的條件組合産(chǎn)生的影響, 從而可(kě)以幫助我們更好的理(lǐ)解規則中(zhōng)配置的條件。

動作(zuò)模版

從2.2.1版本開始,向導式規則集中(zhōng)開始支持動作(zuò)模版。可(kě)以在“規則集”分(fēn)類下創建“動作(zuò)模版”文(wén)件,在動作(zuò)模版文(wén)件中(zhōng),可(kě)以把一些通過的動作(zuò)定義出來,并賦予有(yǒu)意義的名(míng)稱,這樣在向導式規則集文(wén)件中(zhōng)就可(kě)以引用(yòng)動作(zuò)模版文(wén)件并在規則的動作(zuò)部分(fēn)使用(yòng)它, 動作(zuò)模版文(wén)件如下图所示:

定義好動作(zuò)模版文(wén)件後,就可(kě)以在向導式規則文(wén)件裏引用(yòng)并使用(yòng)了,引用(yòng)方式與導入庫文(wén)件的方法一緻,點擊工(gōng)具(jù)欄上的“模版”按鈕,選擇其下的“動作(zuò)模版”菜單項,然後選擇并添加相應的動作(zuò)模版文(wén)件即可(kě);具(jù)體(tǐ)使用(yòng)方法與條件模版相同,這裏就不再贅述。

規則集的運行模式

在2.1.7版本以前,向導式規則集在默認模式下會把當前文(wén)件中(zhōng)所有(yǒu)所有(yǒu)規則編譯成一棵規則樹,根據輸入對象先進行條件匹配計算,計算好後再根據規則設定的優先級來執行所有(yǒu)匹配規則的動作(zuò)部分(fēn)。

如果存在兩個規則A、B,A規則的優先級高于B,A規則根據輸入默認對象屬性值條件可(kě)以滿足,而B規則根據輸入對象條件不滿足,這時執行A規則動作(zuò)部分(fēn),在動作(zuò)中(zhōng)将輸入對象某屬性改為(wèi)另外一個值,經過這個修改, B規則此時條件滿足了,但在默認模式下,所有(yǒu)規則的條件匹配動作(zuò)已經完成了,所以在A規則的動作(zuò)部分(fēn)将輸入對象某屬性改為(wèi)B規則滿足的值後,B規則也不會嘗試重新(xīn)匹配條件以執行B規則條件滿足後的動作(zuò)部分(fēn)。

要實現這一功能(néng),在2.1.7之前的版本當中(zhōng),我們隻能(néng)在A規則條件滿足後的修改輸入對象某屬性值的動作(zuò)後添加一個“更新(xīn)工(gōng)作(zuò)區(qū)”的函數,更新(xīn)這個修改後的輸入對象,以使這個對象能(néng)重新(xīn)匹配所有(yǒu)的規則, 看看有(yǒu)沒有(yǒu)滿足條件的,這樣B規則才會被重新(xīn)激活;或者使用(yòng)“執行組”屬性也能(néng)達到同樣的目的,也就是給B規則添加一個“執行組”屬性,在A規則條件滿足後的修改輸入對象某屬性值的動作(zuò)後加上激活B規則對應的執行組。

可(kě)以看到,在默認模式下,對于存在大量相互依賴的向導式規則來說,上述兩種方式用(yòng)起來還是很(hěn)麻煩的,為(wèi)此從2.1.7版本開始,對于向導式規則集文(wén)件添加了一種新(xīn)的“順序”運行模式, 通過向導式規則集的工(gōng)具(jù)欄配置菜單按鈕下的運行模式菜單項,即可(kě)實現将默認模式修改為(wèi)“順序模式”,如下图所示:

在這種模式下,當前規則集裏的所有(yǒu)規則将不會被編譯成一整棵規則樹,而是每個規則都會獨立的編譯成一個規則樹,運行的時候,會根據規則定義的優先級屬性依次運行這些規則樹, 這樣,對于存在上述邏輯情況的業務(wù)來說,我們隻需要修改運行模式為(wèi)“順序模式”,同時為(wèi)各個規則定義好優先級,那麽它們就會逐個執行,優先級較高的規則先執行, 執行後的動作(zuò)部分(fēn)如果存在對業務(wù)數據的修改,就會直接影響到後面規則條件的匹配,不再需要使用(yòng)“更新(xīn)工(gōng)作(zuò)區(qū)”以使規則重新(xīn)嘗試匹配或者使用(yòng)“執行組”屬性對規則執行順序進行編排,這樣可(kě)以大大簡化業務(wù)規則定義的複雜度。

需要指出的是“順序模式”下,因為(wèi)規則是一條條匹配,所以性能(néng)上相比“默認模式”要差一些,如沒有(yǒu)特殊需要不建議采用(yòng)“順序模式”。

results matching ""

    No results matching ""