11.規(guī)則流

2019-10-15 12:11 更新

11.規(guī)則流

簡(jiǎn)介

規(guī)則流又稱決策流,它整個(gè)的結(jié)構(gòu)類似于工作流,用來(lái)對(duì)已有的決策集、決策表、交叉決策表、決策樹(shù)、評(píng)分卡、復(fù)雜評(píng)分卡或其它決策流的執(zhí)行順序進(jìn)行編排,以清晰直觀的實(shí)現(xiàn)一個(gè)大的復(fù)雜的業(yè)務(wù)規(guī)則。

URule Pro規(guī)則引擎中的決策流可以實(shí)現(xiàn)對(duì)已有的決策集、決策表、交叉決策表、決策樹(shù)、評(píng)分卡、復(fù)雜評(píng)分卡或其它決策流進(jìn)行編排執(zhí)行;編排過(guò)程中即可以常見(jiàn)串行執(zhí)行,也可以并行執(zhí)行、或者是根據(jù)條件選擇分支執(zhí)行。URule Pro中提供了一個(gè)基于網(wǎng)頁(yè)的流程設(shè)計(jì)器,通過(guò)簡(jiǎn)單拖曳就可以快速實(shí)現(xiàn)對(duì)已有的決策集、決策表、交叉決策表、決策樹(shù)、評(píng)分卡、復(fù)雜評(píng)分卡或其它決策流執(zhí)行順序的編排。

URule Pro的規(guī)則流設(shè)計(jì)器基于FlowDesigner項(xiàng)目實(shí)現(xiàn),該項(xiàng)目在Github上的地址為:https://github.com/jacky6024/flowdesigner,flowdesigner是一款上海銳道自主研發(fā)的在瀏覽器中繪制流程圖的Javascript庫(kù),利用它可以快速開(kāi)發(fā)出流程圖相關(guān)的設(shè)計(jì)器。

一個(gè)設(shè)計(jì)好的規(guī)則流如下圖所示:

在這個(gè)流程設(shè)計(jì)器當(dāng)中,上面是工具欄,下面是設(shè)計(jì)區(qū),在工具欄第一排可實(shí)現(xiàn)流程模版的保存、選擇、創(chuàng)建連接、重做、取消、網(wǎng)格吸附、刪除、豎直居中對(duì)齊、水平居中對(duì)齊及將多個(gè)選中節(jié)點(diǎn)設(shè)置成相同尺寸等工具。

工具欄的第二排就是URule Pro中規(guī)則流支持的流程節(jié)點(diǎn),URule Pro中規(guī)則流中共有八種類型的節(jié)點(diǎn),分別是開(kāi)始節(jié)點(diǎn)、規(guī)則節(jié)點(diǎn)、規(guī)則包節(jié)點(diǎn)、動(dòng)作節(jié)點(diǎn)、腳本節(jié)點(diǎn)、決策節(jié)點(diǎn)、分支節(jié)點(diǎn)、聚合節(jié)點(diǎn)。

需要注意的是,URule Pro的規(guī)則流中沒(méi)有結(jié)束節(jié)點(diǎn),在URule Pro的規(guī)則流當(dāng)中,規(guī)則流必須要以開(kāi)始節(jié)點(diǎn)開(kāi)始,可以在任何分支以任意節(jié)點(diǎn)結(jié)束,這點(diǎn)與類似UFLO 之類的工作流引擎不同,UFLO 之類的工作流引擎要求流必須要以開(kāi)始節(jié)點(diǎn)開(kāi)始,同時(shí)任何分支都必須要以結(jié)束節(jié)點(diǎn)結(jié)束。

創(chuàng)建決策流

打開(kāi)URule Pro規(guī)則引擎控制臺(tái),在項(xiàng)目的“決策流”節(jié)點(diǎn)點(diǎn)右鍵,從右鍵菜單中選擇創(chuàng)建決策流,創(chuàng)建一個(gè)新的決策流文件,如下圖:

在設(shè)計(jì)器的設(shè)計(jì)區(qū)中,屬性面板是可移動(dòng)的,我們可以通過(guò)鼠標(biāo)點(diǎn)擊屬性面板任何部位來(lái)移動(dòng)它。點(diǎn)擊工具欄第二行上的流程節(jié)點(diǎn)圖標(biāo),然后在設(shè)計(jì)區(qū)單擊,就可以在設(shè)計(jì)區(qū)添加對(duì)應(yīng)節(jié)點(diǎn)。

在URule Pro的決策流中,節(jié)點(diǎn)圖標(biāo)的尺寸是可以通過(guò)鼠標(biāo)改變的;節(jié)點(diǎn)創(chuàng)建完成后,可點(diǎn)擊工具欄第一行上的連線圖標(biāo),在節(jié)點(diǎn)間添加連接。點(diǎn)擊工具欄上的選擇圖標(biāo),可實(shí)現(xiàn)節(jié)點(diǎn)或連線的選擇,選擇方式可以是點(diǎn)選,或拖選。

在定義好節(jié)點(diǎn)間的連線后,如需將連線變成折線,那么可以先采用拖選方式選中目標(biāo)連線,如下圖所示:

選中連線后,中連線中間就會(huì)出現(xiàn)可拖拽的錨點(diǎn),拖動(dòng)描點(diǎn)即可改變連線形狀,如下圖所示:

如不需要這個(gè)錨點(diǎn),那么可以先取消連線的選擇,然后再次選中連線,雙擊要?jiǎng)h除的錨點(diǎn),這樣即可刪除錨點(diǎn)對(duì)象,對(duì)應(yīng)的連線也會(huì)回到?jīng)]有錨點(diǎn)的狀態(tài)。

節(jié)點(diǎn)或連接選中后就可以在屬性面板上修改它們的屬性,點(diǎn)擊選擇圖標(biāo)后,在設(shè)計(jì)區(qū)空白處點(diǎn)擊就可以配置決策流的全局屬性,如定義決策流ID,需要導(dǎo)入的庫(kù)文件等。

決策流的全局屬性有兩塊,第一塊就是決策流的ID,這個(gè)很重要,在一知識(shí)包中,如果有多個(gè)決策流,那么決策流ID要唯一;第二部分是導(dǎo)入相關(guān)庫(kù)文件,這與之前介紹的決策集、決策表、決策樹(shù)、評(píng)分卡一樣,唯一不同是這里的庫(kù)文件管理放在了屬性面板上。

接下來(lái)就來(lái)介紹URule Pro中決策流提供的各種類型節(jié)點(diǎn)的作用及使用方法。

開(kāi)始節(jié)點(diǎn)

開(kāi)始節(jié)點(diǎn),是一個(gè)規(guī)則流開(kāi)始的地方,在URule Pro當(dāng)中,決策流必須要以開(kāi)始節(jié)點(diǎn)開(kāi)始,開(kāi)始節(jié)點(diǎn)的屬性比較簡(jiǎn)單,只有兩個(gè),如下表所示:

屬性名 數(shù)據(jù)類型 描述
節(jié)點(diǎn)名稱 String 設(shè)置當(dāng)前節(jié)點(diǎn)名稱
事件Bean String 一實(shí)現(xiàn)了com.bstek.urule.model.flow.NodeEvent接口配置在Spring中bean的id,一旦配置在流程進(jìn)入及離開(kāi)該節(jié)點(diǎn)時(shí)會(huì)觸發(fā)這個(gè)實(shí)現(xiàn)類

NodeEvent接口源碼如下:

package com.bstek.urule.model.flow;
import com.bstek.urule.model.flow.ins.FlowContext;
import com.bstek.urule.model.flow.ins.FlowInstance;
/**
 * @author Jacky.gao
 * @since 2015年4月20日
 */
public interface NodeEvent {
    /**
     * 規(guī)則流流入當(dāng)前節(jié)點(diǎn)觸發(fā)的方法
     * @param node 當(dāng)前節(jié)點(diǎn)對(duì)象
     * @param instance 當(dāng)前規(guī)則流實(shí)例對(duì)象
     * @param context 規(guī)則流上下文件對(duì)象
     */
    void enter(FlowNode node,FlowInstance instance,FlowContext context);
    /**
     * 規(guī)則流流出當(dāng)前節(jié)點(diǎn)觸發(fā)的方法
     * @param node 當(dāng)前節(jié)點(diǎn)對(duì)象
     * @param instance 當(dāng)前規(guī)則流實(shí)例對(duì)象
     * @param context 規(guī)則流上下文件對(duì)象
     */
    void leave(FlowNode node,FlowInstance instance,FlowContext context);
}

開(kāi)始節(jié)點(diǎn)出入連接線如下表所示:

流入的連接線數(shù)量 流出的連接線數(shù)量
0 1

規(guī)則節(jié)點(diǎn)

所謂規(guī)則節(jié)點(diǎn),用來(lái)綁定URule Pro當(dāng)中提供的決策集、決策表、交叉決策表、決策樹(shù)、評(píng)分卡、復(fù)雜評(píng)分卡或其它決策流文件的節(jié)點(diǎn)。值得注意的是,一個(gè)規(guī)則節(jié)點(diǎn)只能與一個(gè)當(dāng)前項(xiàng)目中決策集、決策表、交叉決策表、決策樹(shù)、評(píng)分卡、復(fù)雜評(píng)分卡或其它決策流文件綁定,這樣一旦決策流流轉(zhuǎn)到當(dāng)前節(jié)點(diǎn),那么就可以執(zhí)行與這個(gè)規(guī)則節(jié)點(diǎn)綁定的決策集、決策表、交叉決策表、決策樹(shù)、評(píng)分卡、復(fù)雜評(píng)分卡或其它決策流文件。

在設(shè)計(jì)器中,選中目標(biāo)規(guī)則節(jié)點(diǎn),就可以在屬性面板中設(shè)置其相關(guān)屬性,規(guī)則節(jié)點(diǎn)屬性如下:

屬性名 數(shù)據(jù)類型 描述
節(jié)點(diǎn)名稱 String 設(shè)置當(dāng)前節(jié)點(diǎn)名稱
事件bean String 一實(shí)現(xiàn)了com.bstek.urule.model.flow.NodeEvent接口配置在Spring中bean的id,一旦配置在流程進(jìn)入及離開(kāi)該節(jié)點(diǎn)時(shí)會(huì)觸發(fā)這個(gè)實(shí)現(xiàn)類
文件 String 與當(dāng)前節(jié)點(diǎn)綁定的決策集、決策表、交叉決策表、決策樹(shù)、評(píng)分卡、復(fù)雜評(píng)分卡或其它決策流文件
版本 String 與當(dāng)前節(jié)點(diǎn)綁定的決策集、決策表、決策樹(shù)、評(píng)分卡或其它決策流文件的版本

規(guī)則節(jié)點(diǎn)出入連接下如下表所示:

流入的連接線數(shù)量 流出的連接線數(shù)量
1~n 0~1

知識(shí)包節(jié)點(diǎn)

與規(guī)則節(jié)點(diǎn)不同,知識(shí)包節(jié)點(diǎn)是用來(lái)與具體的知識(shí)包綁定的,這樣就可以實(shí)現(xiàn)復(fù)雜規(guī)則調(diào)用。知識(shí)包節(jié)點(diǎn)與某個(gè)知識(shí)包綁定之后,運(yùn)行時(shí)規(guī)則流流轉(zhuǎn)到這個(gè)節(jié)點(diǎn)后,就會(huì)執(zhí)行與之綁定的知識(shí)包,如果綁定的知識(shí)包中包含決策流,那么引擎會(huì)自動(dòng)執(zhí)行其中的決策流,如果規(guī)則包中包含的規(guī)則流有多個(gè),那么默認(rèn)只會(huì)執(zhí)行其中的第一個(gè)規(guī)則流,否則只執(zhí)行觸發(fā)規(guī)則動(dòng)作。

知識(shí)包節(jié)點(diǎn)屬性如下表所示:

屬性名稱 數(shù)據(jù)類型 描述
節(jié)點(diǎn)名稱 String 設(shè)置當(dāng)前節(jié)點(diǎn)名稱
事件bean String 一實(shí)現(xiàn)了com.bstek.urule.model.flow.NodeEvent接口配置在Spring中bean的id,一旦配置在流程進(jìn)入及離開(kāi)該節(jié)點(diǎn)時(shí)會(huì)觸發(fā)這個(gè)實(shí)現(xiàn)類
知識(shí)包 String 要與當(dāng)前節(jié)點(diǎn)綁定的具體的知識(shí)包,我們可以通過(guò)下拉列表選擇當(dāng)前項(xiàng)目下已創(chuàng)建好的可用知識(shí)包。

知識(shí)包節(jié)點(diǎn)出入連接線如下表所示:

流入的連接線數(shù)量 流出的連接線數(shù)量
1~n 0~1

動(dòng)作節(jié)點(diǎn)

動(dòng)作節(jié)點(diǎn)可以與一個(gè)實(shí)現(xiàn)了com.bstek.urule.model.flow.FlowAction接口并配置到Spring中的Bean綁定,這樣在運(yùn)行時(shí),規(guī)則流執(zhí)行到這個(gè)動(dòng)作節(jié)點(diǎn)時(shí)就會(huì)執(zhí)行與之綁定的FlowAction實(shí)現(xiàn)類,動(dòng)作節(jié)點(diǎn)屬性如下表所示:

屬性名稱 數(shù)據(jù)類型 描述
節(jié)點(diǎn)名稱 String 設(shè)置當(dāng)前節(jié)點(diǎn)名稱
事件bean String 一實(shí)現(xiàn)了com.bstek.urule.model.flow.NodeEvent接口配置在Spring中bean的id,一旦配置在流程進(jìn)入及離開(kāi)該節(jié)點(diǎn)時(shí)會(huì)觸發(fā)這個(gè)實(shí)現(xiàn)類
動(dòng)作bean String 一個(gè)實(shí)現(xiàn)了com.bstek.urule.model.flow.FlowAction接口并配置到Spring中的Bean的ID。

FlowAction接口源碼如下所示:

package com.bstek.urule.model.flow;
import com.bstek.urule.model.flow.ins.FlowContext;
import com.bstek.urule.model.flow.ins.FlowInstance;
/**
 * @author Jacky.gao
 * @since 2015年2月28日
 */
public interface FlowAction {
    /**
     * @param node 當(dāng)前節(jié)點(diǎn)對(duì)象
     * @param context 規(guī)則流上下文件對(duì)象
     * @param instance 當(dāng)前規(guī)則流實(shí)例對(duì)象
     */
    void execute(ActionNode node,FlowContext context,FlowInstance instance);
}

有了動(dòng)作節(jié)點(diǎn),那么在規(guī)則流中就可以執(zhí)行具體的Java類中的方法,因?yàn)樵揓ava類是配置在Spring上下文中的,所以類中可訪問(wèn)Spring環(huán)境所有信息,這樣就可以做一些更為復(fù)雜的業(yè)務(wù)操作。

動(dòng)作節(jié)點(diǎn)出入連接線如下表所示:

流入的連接線數(shù)量 流出的連接線數(shù)量
1~n 0~1

腳本節(jié)點(diǎn)

顧名思義,腳本節(jié)點(diǎn)就是可以在這個(gè)節(jié)點(diǎn)上綁定一段腳本,這樣在運(yùn)行時(shí),規(guī)則流流轉(zhuǎn)到該節(jié)點(diǎn)時(shí)就可以執(zhí)行這段腳本。腳本節(jié)點(diǎn)上的腳本屬性就是我們編寫(xiě)要執(zhí)行的腳本的地方,如下圖所示:

在腳本屬性中,我們提供了一個(gè)腳本編輯器,通過(guò)這個(gè)編輯器,結(jié)合代碼提示(快捷鍵ALT+/)可快速編寫(xiě)要執(zhí)行的腳本。腳本節(jié)點(diǎn)中編寫(xiě)的規(guī)則,完全遵循腳本式?jīng)Q策集中普通規(guī)則的then與end之間動(dòng)作腳本編寫(xiě)語(yǔ)法規(guī)范。也就是說(shuō),腳本節(jié)點(diǎn)中添加的腳本沒(méi)有if、then、end及條件判斷腳本,有的只是執(zhí)行動(dòng)作的腳本。

在URule Pro中,腳本節(jié)點(diǎn)中直接寫(xiě)腳本已經(jīng)不再推薦了,所以可以看到類型屬性里有兩個(gè),一個(gè)是動(dòng)作腳本,另一個(gè)是向?qū)絼?dòng)作。在動(dòng)作腳本項(xiàng)里加上了(不推薦)的標(biāo)注,而推薦的做法是選擇向?qū)絼?dòng)作,選擇向?qū)絼?dòng)作后就可以像在向?qū)揭?guī)則集中那樣,通過(guò)鼠標(biāo)點(diǎn)擊來(lái)完成動(dòng)作的定義,如下圖所示:

之所以不推薦使用腳本方式來(lái)定義動(dòng)作,和之前在腳本式規(guī)則集里介紹原因一致,那么手寫(xiě)腳本易出錯(cuò),向?qū)Х绞胶?jiǎn)單,出錯(cuò)機(jī)率低,所以推薦大家使用。在后續(xù)版本中,腳本節(jié)點(diǎn)可能會(huì)刪除腳本定義方式,只保留向?qū)絼?dòng)作定義方式。

腳本節(jié)點(diǎn)出入連接線如下表所示:

流入的連接線數(shù)量 流出的連接線數(shù)量
1~n 0~1

決策節(jié)點(diǎn)

所謂決策節(jié)點(diǎn)就是指在運(yùn)行時(shí),根據(jù)為其下流出連接配置的條件來(lái)決定究竟應(yīng)該走哪條連接的節(jié)點(diǎn),所以根據(jù)這一特性,決策節(jié)點(diǎn)下流出連接至少要有兩條,否則決策節(jié)點(diǎn)就沒(méi)有意義了。

選中決策節(jié)點(diǎn),在其右邊屬性面板中就可以看到針對(duì)決策節(jié)點(diǎn)的配置,如下圖所示:

需要重點(diǎn)介紹的是“決策類型”屬性,決策節(jié)點(diǎn)的有兩種決策類型,分別是"條件"和"百分比"。

當(dāng)選擇決策類型為條件時(shí),就會(huì)看到如上圖所示效果。選擇“條件”類型時(shí),在下面出現(xiàn)的在決策項(xiàng)當(dāng)中,可以根據(jù)當(dāng)前決策節(jié)點(diǎn)下流出連接的數(shù)量添加對(duì)應(yīng)的決策項(xiàng),對(duì)于每條決策項(xiàng),都有兩個(gè)屬性,分別是"條件腳本"和“流向”,在條件列當(dāng)中,我們可以編寫(xiě)具體的條件,在流向列中選擇當(dāng)條件列中定義的條件滿足時(shí)要流出連線名稱,所以對(duì)于決策節(jié)點(diǎn)下流出的連線,我們必須要為其設(shè)置名稱,否則就無(wú)法為其定義決策項(xiàng)。

為連線定義名稱,需要首先用拖選的方式選中它,然后就可以在屬性面板上為其定義名稱。

在條件表格中,點(diǎn)擊條件編輯按鈕,就會(huì)彈出條件編輯窗口,在這個(gè)窗口里,定義條件的方式有兩種:一種是腳本方式;一種是向?qū)Х绞健?/p>

腳本方式定義條件,其語(yǔ)法遵循腳本式規(guī)則中條件部分的語(yǔ)法規(guī)范,同樣因?yàn)槟_本需要手工編寫(xiě)的特性,所以現(xiàn)在同樣也不再推薦使用腳本方式定義條件,而是推薦使用向?qū)Х绞蕉x條件,如下圖所示:

如果將決策類型改為“百分比”,則可以看到如下圖所示效果:

如上圖所示,一旦將決策類型改為“百分比”,那么就可以為每個(gè)流向設(shè)置流量百分比,如上圖當(dāng)中,在實(shí)際規(guī)則流運(yùn)行時(shí),將有30%走"c1"連線,70%走"c0"連線。配置時(shí)無(wú)論決策節(jié)點(diǎn)下有多少離開(kāi)連線,最終所有的百分比加在一起要達(dá)到100%, 百分比這里一定要是一個(gè)合法的整數(shù),否則會(huì)出現(xiàn)錯(cuò)誤。

百分比模式下還有一個(gè)名為“作用范圍”的選項(xiàng),默認(rèn)值為“批處理”,表示“百分比”類型的計(jì)算有效期為當(dāng)前線程,一旦有新線程開(kāi)啟,那么這個(gè)百分比的值將開(kāi)始重新計(jì)算;如果將“作用范圍”改為“每次調(diào)用”,那么生效就不再局限于當(dāng)前線程,每次調(diào)用在經(jīng)過(guò)這個(gè)決策節(jié)點(diǎn)時(shí)都會(huì)根據(jù)百分比進(jìn)行分流計(jì)算。

值得注意的時(shí),當(dāng)選擇決策類型為“條件”,在運(yùn)行時(shí),當(dāng)決策流流轉(zhuǎn)到當(dāng)前節(jié)點(diǎn)時(shí),如果決策項(xiàng)中定義的各個(gè)條件都不滿足,那么規(guī)則流到此就結(jié)束了,相反,如果有多個(gè)決策項(xiàng)滿足時(shí),那么系統(tǒng)將取第一條滿足條件的決策項(xiàng)對(duì)應(yīng)的流向連線進(jìn)行向下流轉(zhuǎn),而不會(huì)選擇所有滿足條件的連線向下流轉(zhuǎn)。

需要注意的是,百分比類型的“批處理”作用范圍下決策方式,必須要在代碼中通過(guò)批處理的方式執(zhí)行才會(huì)生效,必須要使用后面章節(jié)里介紹的BatchSession來(lái)一次性處理一批數(shù)據(jù),或者一個(gè)KnowledgeSession一次性處理一批數(shù)據(jù),否則規(guī)則流永遠(yuǎn)都只會(huì)走默認(rèn)的百分比占比最高的那條路徑。
當(dāng)然如果百分比類型的作用范圍改為“每次調(diào)用”,那么規(guī)則的每次調(diào)用都會(huì)根據(jù)百分比來(lái)計(jì)算分流。

決策節(jié)點(diǎn)出入連接線下如下表所示:

流入的連接線 流出的連接線
1~n 1~n

分支節(jié)點(diǎn)

分支節(jié)點(diǎn)是URule Pro當(dāng)中提供的一種可實(shí)現(xiàn)規(guī)則流多條并行的節(jié)點(diǎn),通過(guò)這個(gè)節(jié)點(diǎn),可以根據(jù)當(dāng)前節(jié)點(diǎn)下流出連線數(shù)量,將當(dāng)前規(guī)則流實(shí)現(xiàn)拆分成若干條子的規(guī)則流實(shí)例并行運(yùn)行,根據(jù)這一特性,分支節(jié)點(diǎn)下至少要有兩條流出的連線才有意義。

在決策流實(shí)例流轉(zhuǎn)到分支節(jié)點(diǎn)時(shí),分支節(jié)點(diǎn)會(huì)根據(jù)其下流出的連接線數(shù)量將主的實(shí)例拆分成與連線對(duì)應(yīng)的若干個(gè)子實(shí)例,以并行方式繼續(xù)運(yùn)行產(chǎn)生的多個(gè)流實(shí)例。

分支節(jié)點(diǎn)出入連接線如下表所示:

流入的連接線數(shù)量 流出的連接線數(shù)量
1~n 1~n

默認(rèn)情況下,分支節(jié)點(diǎn)會(huì)將主流程拆分成若干子流程執(zhí)行,在實(shí)際執(zhí)行的時(shí)候還是在一個(gè)線程內(nèi)先后執(zhí)行各個(gè)分支。

從2.2.1版本開(kāi)始,在分支節(jié)點(diǎn)上新增一名為“啟用多線程”的屬性。默認(rèn)情況下,如果不設(shè)置該屬性,那么它的值為“系統(tǒng)默認(rèn)”,這時(shí)將采用系統(tǒng)中定義的名為urule.flowForkMultiThread參數(shù)的值,由這個(gè)參數(shù)值來(lái)決定當(dāng)前分支下是否采用多線程運(yùn)行, urule.flowForkMultiThread參數(shù)值默認(rèn)為false,也就是不開(kāi)啟多線程運(yùn)行。

如果希望其下所有子分支以多線程形式并行,那么可以選中當(dāng)前分支節(jié)點(diǎn),將其“啟用多線程”屬性設(shè)置為“是”,或者將urule.flowForkMultiThread參數(shù)設(shè)置值為true, 這樣引擎在執(zhí)行到分支節(jié)點(diǎn)時(shí)會(huì)在不同的線程中執(zhí)行其下各個(gè)分支,這對(duì)于各個(gè)分支業(yè)務(wù)邏輯不相關(guān)的業(yè)務(wù),同時(shí)各個(gè)分支執(zhí)行比較耗時(shí),通過(guò)這樣的配置讓分支在不同線程里執(zhí)行,所以可以明顯提高系統(tǒng)執(zhí)行性能。

需要注意的是分支節(jié)點(diǎn)的“啟用多線程”屬性值為“系統(tǒng)默認(rèn)”時(shí)采用的是名為urule.flowForkMultiThread參數(shù)的值,否則就會(huì)覆蓋這個(gè)全局參數(shù)的值,由當(dāng)前分支節(jié)點(diǎn)自主決定是否開(kāi)啟多線程。

注意,當(dāng)設(shè)置了參數(shù)urule.flowForkMultiThread=true 或配置了分支節(jié)點(diǎn)的“啟用多線程”屬性值為“是”時(shí),分支節(jié)點(diǎn)下必須要添加一個(gè)聚合節(jié)點(diǎn),將所有分支連接到聚合節(jié)點(diǎn)上,否則執(zhí)行會(huì)出現(xiàn)錯(cuò)誤。

聚合節(jié)點(diǎn)

聚合節(jié)點(diǎn)就是用來(lái)聚合由分支節(jié)點(diǎn)拆分出來(lái)的多個(gè)子的規(guī)則流的,所以有聚合節(jié)點(diǎn),就一定要有分支節(jié)點(diǎn),但有分支節(jié)點(diǎn)卻不一定需要聚合節(jié)點(diǎn)(但如果設(shè)置了參數(shù)urule.flowForkMultiThread=true,或配置了分支節(jié)點(diǎn)的“啟用多線程”屬性值為“是”時(shí),分支節(jié)點(diǎn)就啟用了多線程執(zhí)行功能,這樣分支節(jié)點(diǎn)下一定需要一個(gè)聚合節(jié)點(diǎn),否則會(huì)出現(xiàn)錯(cuò)誤),對(duì)于URule Pro的決策流來(lái)說(shuō),拆分出子的決策流后是否有聚合節(jié)點(diǎn)是可選的,但聚合節(jié)點(diǎn)的出現(xiàn)則一定要有分支節(jié)點(diǎn)來(lái)配合,否則聚合節(jié)點(diǎn)就沒(méi)有意義了。

聚合節(jié)點(diǎn)出入連接線如下表所示:

流入的連接線數(shù)量 流出的連接線數(shù)量
1~n 0~n

示例

下圖中是一個(gè)簡(jiǎn)單的決策流定義,它由一個(gè)開(kāi)始節(jié)點(diǎn)、三個(gè)腳本節(jié)點(diǎn)和一個(gè)決策節(jié)點(diǎn)構(gòu)成。

在這個(gè)決策流中,我們定義它的ID為“flow-demo”,同時(shí)導(dǎo)入了我們之前定義好的包含“會(huì)員”的變量庫(kù)文件。決策流在經(jīng)過(guò)“開(kāi)始”節(jié)點(diǎn)后,進(jìn)入“腳本1”節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)上定義的腳本比較簡(jiǎn)單,只是簡(jiǎn)單向控制臺(tái)輸出一段文本,如下圖:

接下來(lái)就進(jìn)入“決策”節(jié)點(diǎn),在決策節(jié)點(diǎn),我們選擇的是“條件”作為決策類型,分別定義了兩條連線的流向條件,如下圖:

流向“to2”連線上定義的條件內(nèi)容如下圖:

流向“to3”連線上定義的條件內(nèi)容如下圖:

從上面的兩張圖中可以看到,當(dāng)會(huì)員對(duì)象的等級(jí)屬性在0~5之間時(shí)選擇"to2"連線;在5~10之間時(shí)選擇"to3"連線。

決策節(jié)點(diǎn)下面是兩個(gè)腳本節(jié)點(diǎn),為他們定義腳本內(nèi)容如下圖:

決策流定義的信息就是這些,接下來(lái)我們?cè)谥R(shí)包節(jié)點(diǎn)對(duì)其進(jìn)行仿真測(cè)試,看看運(yùn)行路徑是不是如我們所預(yù)期。

打開(kāi)“知識(shí)包”節(jié)點(diǎn),在其下創(chuàng)建一個(gè)新的知識(shí)包,將這個(gè)決策流文件添加到知識(shí)包中,點(diǎn)擊工具欄上的“仿真測(cè)試”按鈕,在彈出的窗口中輸入“會(huì)員”的等級(jí)屬性值,點(diǎn)擊工具欄上的“測(cè)試決策流”按鈕,在彈出的窗口中選擇我們定義的“flow-demo”,點(diǎn)擊“操作列”上的測(cè)試圖標(biāo),既完成了對(duì)當(dāng)前決策流的測(cè)試,如下圖:

查看控制臺(tái),可以看到如下圖所示的內(nèi)容輸出:

在上面的例子中,腳本節(jié)點(diǎn)里的動(dòng)作以及決策節(jié)點(diǎn)中的條件都是采用腳本的方式定義,這里您也可以改成向?qū)Х绞蕉x,比較一下兩種定義方式的區(qū)別,這里就不再贅述。

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)