4.規(guī)則集

2019-10-15 12:10 更新

4.規(guī)則集

概述

規(guī)則集也叫決策集,在URule Pro當中是由一組普通規(guī)則和循環(huán)規(guī)則構成的規(guī)則集合,是使用頻率最高的一種業(yè)務規(guī)則實現(xiàn)方式。

在URule Pro中規(guī)則有兩種類型:一種是普通規(guī)則;一種是循環(huán)規(guī)則。所謂的普通規(guī)則是指一種由如果、那么、否則三個部分構成的規(guī)則;而循環(huán)規(guī)則顧名思義就是可循環(huán)的規(guī)則,它允許指定一個集合類型的對象,對這個集合中每個對象進行循環(huán)迭代,在循環(huán)體中則是若干個由如果、那么、否則構成的普通規(guī)則。

在定義方式上,URule Pro提供了向?qū)揭?guī)則集以及腳本式規(guī)則集定義兩種。

所謂向?qū)揭?guī)則集是指利用引擎提供的設計器,一步一步通過鼠標點擊就可以完成其中的普通規(guī)則與循環(huán)規(guī)則的配置,配合高度可視化的向?qū)揭?guī)則設計器,可以最大限度將業(yè)務規(guī)則可視化,降低規(guī)則配置的復雜度;而腳本式規(guī)則集顧名思義就是通過在規(guī)則集文件當中按URule Pro的腳本語法規(guī)范來書寫腳本實現(xiàn)普通規(guī)則與循環(huán)規(guī)則的定義工作。

向?qū)揭?guī)則集因為是圖形化,向?qū)Х绞綐嫿ㄒ?guī)則,所以適合業(yè)務人員使用;而腳本式規(guī)則集通過書寫腳本構成規(guī)則,與傳統(tǒng)代碼編寫類似,所以適合技術人員來編寫規(guī)則;從功能上看,向?qū)揭?guī)則集和腳本式規(guī)則集能實現(xiàn)的功能是完全相同的,也就是說向?qū)揭?guī)則集中能實現(xiàn)的功能在腳本式規(guī)則集也完全可以實現(xiàn),反之亦然。

在URule Pro當中,雖然說腳本式規(guī)則能實現(xiàn)向?qū)揭?guī)則中提供的所有功能,但我們還是推薦大家采用向?qū)揭?guī)則集文件來定義我們的業(yè)務規(guī)則,原因很簡單,向?qū)揭?guī)則構建規(guī)則方式是可視化的,構建好的規(guī)則可讀性更好,這樣構建業(yè)務規(guī)則中出錯的機率就會更小。

打開一個URule Pro的項目,在“決策集”節(jié)點右鍵選擇創(chuàng)建一個向?qū)經(jīng)Q策集文件,創(chuàng)建好的文件通過URule Pro向?qū)經(jīng)Q策集設計器打開后的效果如下:

在向?qū)經(jīng)Q策集的設計器中,通過頂部的工具欄,點擊“添加規(guī)則”按鈕可以添加一個普通的由如果、那么、否則構成的普通規(guī)則;點擊“添加循環(huán)規(guī)則”按鈕可以添加一個可以循環(huán)的規(guī)則。之前介紹的變量、常量、參數(shù)、動作四種類型的庫文件,在向?qū)揭?guī)則里就可以導入使用了。

普通規(guī)則

點擊“添加規(guī)則”按鈕就在下面的工作區(qū)里添加了一個普通的規(guī)則,如下圖所示:

一個普通規(guī)則主體是由如果、那么、否則構成,點擊規(guī)則名可以對規(guī)則名進行修改,修改完成后鼠標點擊頁簽處離開焦點就完成了規(guī)則名的修改確認;點擊“添加屬性”鏈接可以為當前規(guī)則定義相關屬性。無論是普通規(guī)則還是循環(huán)規(guī)則都支持下面這些屬性。

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

從2.1.7版本開始,向?qū)揭?guī)則文件工具欄上新增了一個用于控制當前文件中所有向?qū)揭?guī)則日志輸出的開關按鈕,它的默認狀態(tài)為“禁用調(diào)試日志輸出”,如果我們希望打開當前文件中所有向?qū)揭?guī)則的日志輸出功能,那么只需要在這里
將“禁用調(diào)試日志輸出”改為“允許調(diào)試日志輸出”即可。

規(guī)則名及屬性定義完成后,接下來就可以開始配置規(guī)則的主體部分,首先是“如果”部分,在如果部分當中可以添加若干條件,添加完條件后,就可以通過鼠標點擊以向?qū)Х绞皆O置條件,如下圖:

對于一個具體的條件來說,我們可以將其分為三個部分,分別是條件左邊部分、比較操作符以及條件右邊部分。條件左邊部分,如上圖所示我們可選擇的有變量、參數(shù)或者方法或函數(shù),當然這相應的需要我們導入相關的變量庫、參數(shù)庫以及方法庫;對于操作符目前URule Pro當中提供了下面這些操作比較符,如下圖所示:

這些操作比較符基本已涵蓋我們業(yè)務當中所有類型的比較操作。選擇完比較操作符后,我們就可以來設置條件右邊部分。條件右邊部分相比左邊,可選擇的值類型會更多一些,如下圖:

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

在配置條件時,需要我們把之前定義好的變量庫文件、參數(shù)庫文件、常量庫文件、動作庫文件導入進來。對于條件來說,可以是多個條件,也可以是多個復合條件組合,這樣都是通過鼠標點擊操作完成,這里就不再贅述。

條件配置完成后,可以為“那么”或“否則”部分添加動作,那么部分的動作只有條件滿足時執(zhí)行,反之,否則部分的動作只在條件不滿足時執(zhí)行,不加動作意味著什么也不干,動作可以有多個,多個動作添加完成后可以通過拖曳改變順序。

目前在URule Pro當中支持的動作類型有三種,分別是:打印內(nèi)容到控制臺、變量賦值以及執(zhí)行方法或函數(shù),如下圖所示:

所謂的”打印內(nèi)容到控制臺“其實就是將我們需要的信息打印輸出到java 控制臺,對于內(nèi)容可以是一個普通的輸入值,也可以是一些復雜的值類型或它們的加、減、乘、除組合,及添加括號定義算術運行優(yōu)先級;變量賦值也就是給當前導入的變量庫或參數(shù)庫的值進行賦值,值類型可以是一個普通的輸入值,也可以是一些復雜的值類型或它們的加、減、乘、除組合,及添加括號定義算術運行優(yōu)先級;最后一種類型的動作是執(zhí)行方法或函數(shù),要選擇執(zhí)行的方法或函數(shù),前提是我們必須方法所在的動作庫文件導入到當前規(guī)則文件當中,否則就看不到要執(zhí)行的方法,一旦選擇執(zhí)行方法后,如果當前方法當中包含參數(shù),那么我們也需要選擇相應的值為參數(shù)賦值,同樣參數(shù)的值可以是一個普通的輸入值,也可以是一些復雜的值類型或它們的加、減、乘、除組合。動作的具體配置都是基于鼠標點擊操作的,比較簡單,這里不再贅述。

在向?qū)揭?guī)則編輯器中,可以通過鼠標拖曳來改變那么或否則部分的動作順序,同時,對于多個規(guī)則文件,也可以通過拖曳來改變它們的顯示順序。

示例

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

可以看到這兩個規(guī)則條件都比較簡單,并且他們是互斥的,同一時刻最多只會滿足一個規(guī)則。接下來需要對這個決策集進行測試,測試方法比較簡單,點擊項目的“知識包”節(jié)點,在打開的編輯器中添加一個知識包,并將這個做好的規(guī)則集文件放到這個包中,如下圖所示:

知識包是URule Pro中提供的一種用于將一個或多個規(guī)則集、決策表、交叉決策表、決策樹、評分卡、復雜評分卡、評分流文件打包的工具,知識包的編碼屬性比較重要,是這個包在當前項目中的ID。 定義好知識包及這個包中包含的資源文件后,可以點擊工具欄上的“快速測試”按鈕對當前知識包進行仿真測試。

點擊工具欄上的“快速測試”按鈕可以看到如下圖所示的界面:

快速測試是URule Pro當中提供的一種針對知識包的測試工具,通過它可對定義好的知識包預先進行測試??焖贉y試中,會將這個知識包中涉及到的所有BOM對象羅列出來,用戶可以對BOM對象的屬性進行賦值測試。

因為我們當前知識包中只有一個決策集文件,而這個文件中只導入了我們之前定義的那個包含Customer實體對象的變量庫文件,所以在上面的仿真測試頁面中我們看到只有一個名為“會員”的BOM對象,在右邊表格中羅列了會員的所有屬性,我們可以在“值”列中對這些屬性進行賦值,然后點擊工具欄上的“測試決策包”就可以將當前BOM的值提交到引擎中進行測試,如下圖所示。

上圖中我們設置“年齡”屬性為20,“是否有房”屬性為true,“等級”屬性為3,這樣就滿足第一個規(guī)則,所以在點擊“測試決策包”按鈕后,BOM的“名稱”屬性會被命名為“金牌會員”,控制臺也會有相應輸出,這里還有其它的一些情況,可以分別輸入不同的值進行測試,這里就不再贅述。

在仿真測試窗口的工具欄中,“測試決策流”主要是針對決策流進行測試,如果我們的知識包中包含決策流,要對其進行測試,那么就點這個按鈕實現(xiàn);“查看規(guī)則樹”按鈕是用來通過圖形化展示當前知識包所對應的規(guī)則樹結構,如上面的示例,點示此按鈕看到的規(guī)則樹效果如下:

可以看到,在這棵樹中,把規(guī)則定義用到的所有條件節(jié)點都以樹節(jié)點的形式表現(xiàn)出來,條件之間如果是并且關系,那么這些條件節(jié)點在樹中就以串行的形式連接,這樣在實際執(zhí)行時只有前一個節(jié)點條件滿足才會流轉(zhuǎn)到下一節(jié)點;條件之間如果是或者關系,可以看到規(guī)則樹會通過一個"OR"節(jié)點將若干個條件節(jié)點連接,這樣在實際執(zhí)行時,只要有一邊連線到達這個“OR”節(jié)點,那么與這個“OR”節(jié)點連接的其它連線上的條件節(jié)點就不再計算;如果總的條件使用并且連接,但分支上有并且和或者連接的條件,那么在構建規(guī)則樹時就會將分支上的并且條件以串行的形式連接,同時將分支上的或者條件使用“OR”節(jié)點連接,最后再使用“AND”節(jié)點將所有條件連接起來,如上圖所示。

如果規(guī)則中有兩個相同的條件,那么在構建規(guī)則樹時會智能地將這些相同節(jié)點合并為一個節(jié)點,這樣在樹上只會顯示一個節(jié)點,通過這種相同條件節(jié)點的共享機制可以減小規(guī)則樹尺寸,從而減少內(nèi)存占用。

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

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

循環(huán)規(guī)則

循環(huán)規(guī)則,它是一種可以對集合對象進行循環(huán)執(zhí)行的規(guī)則。它的名稱與屬性與普通規(guī)則一樣,接下來是“循環(huán)對象”屬性,要求我們指定一個集合類型的對象,這個對象可以是個參數(shù)或變量 ,規(guī)則在運行時將對這里選擇的集合進行迭代;下面是“開始前動作”屬性,顧名思義,就是在循環(huán)規(guī)則執(zhí)行前做的一些動作,通常我們會在這個地方做一些初始化的動作,比如臨時參數(shù)的初始化賦值等,同樣這里的動作可以是0~n個,如果不定義那么就不執(zhí)行。

接下來是若干個循環(huán)規(guī)則的循環(huán)單元部分,對于一個循環(huán)規(guī)則來說可以有一個或多個循環(huán)單元,每個循環(huán)單元都是一個普通規(guī)則的規(guī)則體,也就是一個由如果、那么、否則三部分構成的普通,定義方式與普通規(guī)則完全相同。

在循環(huán)規(guī)則執(zhí)行時,每迭代一次“循環(huán)對象”,就會將當前迭代的對象插入到工作區(qū),嘗試匹配循環(huán)單元里的每一個規(guī)則體,如果滿足條件就執(zhí)行;最后是“結束后動作”部分,它在循環(huán)執(zhí)行完成后執(zhí)行,動作可以是0~n個,不定義就不執(zhí)行。

在決策集設計器中,點擊工具欄上的“添加循環(huán)規(guī)則”按鈕就可以添加一個循環(huán)規(guī)則,如下圖所示:

我們來看一個例子,通過這個例子來學習循環(huán)規(guī)則的使用方法。

示例

我們要實際的業(yè)務是統(tǒng)計用戶對象里訂單金額小于1000的數(shù)量以及訂單金額大于等于1000的數(shù)量。

首先我們需要在Customer實體類里添加一個新的屬性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("名稱")
    private String name;
    @Label("價格")
    private float price;
    @Label("數(shù)量")
    private int amount;
    //省略getter和setter方法
}

打開我們的customer變量庫文件,在"會員"分類下添加orders變量,同時將新的Order對象添加到庫中,如下圖:

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

庫文件準備好了之后,接下來我們就可以來定義一個循環(huán)規(guī)則來實現(xiàn)統(tǒng)計總價的需求了,定義好的規(guī)則如下:

我們定義的這個循環(huán)規(guī)則中,對會員對象的訂單屬性進行循環(huán),在循環(huán)開始前我們添加了兩個開始前動作,分別對兩個用于統(tǒng)計數(shù)量的參數(shù)作了為零的初始化操作;接下來是循環(huán)的循環(huán)體部分,循環(huán)體中有兩個規(guī)則體,分別用于統(tǒng)計金額小于1000的訂單數(shù)量和金額大于或等于1000的訂單數(shù)量;最后在循環(huán)結束后的動作里添加了將兩個統(tǒng)計數(shù)量的參數(shù)輸出到控制臺的動作。

點擊“知識包”節(jié)點,添加一個用于測試當前這個包含循環(huán)規(guī)則的決策集文件,然后將這個規(guī)則集文件添加到這個知識包中。

點擊工具欄“快速測試”按鈕,對當前循環(huán)規(guī)則包進行測試,在仿真測試窗口中,我們雙擊會員的訂單屬性輸入框,在彈出的窗口中選擇類型為“訂單”,如下圖所示:

確認后,會彈出“訂單”對象的列表,我們可以添加幾條,這樣就實現(xiàn)了為“會員”這個對象添加若干個訂單子對象的功能,如下圖所示:

確認后,可以看到會員的訂單屬性值是一個JSON字符串,這個JSON串表示的就是具體的訂單列表值。

點擊“測試決策包”,就完成了訂單總計統(tǒng)計功能,切換到“參數(shù)”,可以看到兩個用于統(tǒng)計訂單數(shù)量的參數(shù)值已有了結果,如下圖所示:

再看我們的控制臺,也已經(jīng)輸出了兩條訂單數(shù)量信息,如下圖所示:

在循環(huán)規(guī)則當中,有些時候我們可能需要從子對象中找出一個符合條件的就可以了,這樣后面的就不需要循環(huán)了,針對這種情況,URule里還提供了一個名為“跳出循環(huán)”的方法,我們只需要在循環(huán)規(guī)則體的那么中添加這個方法即可,如下圖所示:

在我們這里的循環(huán)規(guī)則中,針對用于統(tǒng)計數(shù)量的兩個參數(shù),在循環(huán)規(guī)則開始前添加兩個動作對它們進行了初始化,將它們的值設置為0。實際上在URule Pro當中,對于參數(shù)的值引擎默認會進行初始化,比如Integer類型的參數(shù)它的默認值就是0,所以上面的兩個初始化的動作實際上是可以省略的。下表中羅列了參數(shù)中會被引擎初始化的數(shù)據(jù)類型的默認值。

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

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

在規(guī)則集中,每個普通規(guī)則和循環(huán)規(guī)則名前都有一個復選框,我們可以根據(jù)需要勾選后點擊工具欄上的“保存為模版按鈕”,如下圖所示:

在彈出的窗口中輸入模版名稱及相關備注信息后即可,如果當前沒有模版分類可以先創(chuàng)建一個分類(模版分類是為了更好的管理規(guī)則模版),然后選中后即可保存。

有了規(guī)則模版后,接下來就可以打開需要導入模版的規(guī)則集文件,選擇工具欄上的“從模版導入”按鈕,就可以將選擇的規(guī)則模版導入到當前規(guī)則集文件中。

規(guī)則模版的適用范圍是當前項目,也就是說當前項目中定義的模版在當前項目中的任何一個規(guī)則集文件中都可以導入使用,有了規(guī)則模版可大幅減少重復勞動,提高開發(fā)效率。

對象名與屬性名的分隔

從2.1.1版本開始,在向?qū)揭?guī)則中引用變量或常量時,分類名與具體屬性名之間的分隔符支持用戶自定義,其中變量默認為“的”;常量默認為空(分隔符為空時常量只顯示常量值而不顯示分類),如下圖所示:

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

屬性名 默認值 描述
urule.variable.link 用于定義向?qū)揭?guī)則中變量分類與屬性之間的分隔符
urule.constant.link 用于定義向?qū)揭?guī)則中常量分類與屬性之間的分隔符,因為該屬性默認值為空,所以我們看到默認向?qū)揭?guī)則中常量不顯示分類,只顯示值,如果給該屬性定義具體值,那么常量的分類就會顯示出來

條件模版

從2.1.9版本開始,可以在“規(guī)則集”分類中創(chuàng)建“條件模版”文件,條件模版的作用就是把一些通用條件進行歸類,并定義好有意義的名稱,這樣在向?qū)降囊?guī)則集文件里就可以引用條件模版文件并在規(guī)則條件中使用條件模版,一個創(chuàng)建好的條件模版文件效果如下圖所示:

條件模版創(chuàng)建完成后,就可以在向?qū)揭?guī)則文件里引用并使用了,引用方式與導入庫文件的方法一致,點擊工具欄上的“模版”按鈕,選擇其下的“條件模版”菜單項,然后選擇并添加相應的條件模版文件即可,如下圖所示:

使用導入的條件模版,只需要在規(guī)則條件里選擇“添加條件模版”即可,如下圖所示:

從2.1.9版本開始,對于向?qū)揭?guī)則,在規(guī)則名邊,還添加了一個可以用于直接查看當前規(guī)則在編譯后條件樹的按鈕,這對于采用了條件模版的規(guī)則來說非常有意義,通過查看編譯后的條件樹,就可以明確在添加了條件模版后對當前規(guī)則的條件組合產(chǎn)生的影響,
從而可以幫助我們更好的理解規(guī)則中配置的條件。

動作模版

從2.2.1版本開始,向?qū)揭?guī)則集中開始支持動作模版??梢栽凇耙?guī)則集”分類下創(chuàng)建“動作模版”文件,在動作模版文件中,可以把一些通過的動作定義出來,并賦予有意義的名稱,這樣在向?qū)揭?guī)則集文件中就可以引用動作模版文件并在規(guī)則的動作部分使用它, 動作模版文件如下圖所示:

定義好動作模版文件后,就可以在向?qū)揭?guī)則文件里引用并使用了,引用方式與導入庫文件的方法一致,點擊工具欄上的“模版”按鈕,選擇其下的“動作模版”菜單項,然后選擇并添加相應的動作模版文件即可;具體使用方法與條件模版相同,這里就不再贅述。

規(guī)則集的運行模式

在2.1.7版本以前,向?qū)揭?guī)則集在默認模式下會把當前文件中所有所有規(guī)則編譯成一棵規(guī)則樹,根據(jù)輸入對象先進行條件匹配計算,計算好后再根據(jù)規(guī)則設定的優(yōu)先級來執(zhí)行所有匹配規(guī)則的動作部分。

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

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

可以看到,在默認模式下,對于存在大量相互依賴的向?qū)揭?guī)則來說,上述兩種方式用起來還是很麻煩的,為此從2.1.7版本開始,對于向?qū)揭?guī)則集文件添加了一種新的“順序”運行模式, 通過向?qū)揭?guī)則集的工具欄上方運行模式按鈕,即可實現(xiàn)將默認模式修改為“順序模式”,如下圖所示:

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

需要指出的是“順序模式”下,因為規(guī)則是一條條匹配,所以性能上相比“默認模式”要差一些,如沒有特殊需要不建議采用“順序模式”。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號