十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
Flowable 中網(wǎng)關(guān)類型其實(shí)也不少,常見的主要有三種類型,分別是:

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比石河子網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式石河子網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋石河子地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴。
這三個里邊最常用的當(dāng)然就是排他網(wǎng)關(guān)了,今天松哥就來和小伙伴們聊一聊這三種網(wǎng)關(guān),一起來體驗(yàn)一把這三種網(wǎng)關(guān)各自的特征。
首先就是排他網(wǎng)關(guān)了,這個也叫互斥網(wǎng)關(guān),長得像下圖這樣:
排他網(wǎng)關(guān)可以有 N 個入口,但是只有一個有效出口。
松哥舉一個例子:
假設(shè)我有一個請假流程,請假 1 天,組長審批,請假小于 3 天,項(xiàng)目經(jīng)理審批,請假大于 3 天,總監(jiān)審批,據(jù)此,我們可以繪制如下流程圖:
在這個流程圖中,當(dāng)流程從排他網(wǎng)關(guān)出來的時候,我們設(shè)置一個變量,根據(jù)變量的值,來決定下一個走哪一個 Task,例如組長審批,我們做如下配置:
這個流條件表示當(dāng) days 這個變量的值小于等于 1 的時候,就會進(jìn)入到組長審批這個 Task。
按照類似的方式,我們來設(shè)置經(jīng)理審批:
最后,總監(jiān)審批的條件如下:
最終,我們來看下這個流程對應(yīng)的 XML 文件,如下:
測試流程
1 && days<=3}]]>
3}]]>
可以看到,在 sequenceFlow 標(biāo)簽中,有一個 conditionExpression 標(biāo)簽,這個標(biāo)簽的內(nèi)容就是具體的條件了。
現(xiàn)在,我們部署一下這個流程,然后按照如下方式來啟動:
@Test
void test01(){
Mapvariables = new HashMap<>();
variables.put("days", 3);
ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01", variables);
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}
注意,這個啟動的時候,傳入一個 days 變量,系統(tǒng)將來會根據(jù)這個變量來決定這個流程要走到哪一個 Task。流程啟動成功之后,我們?nèi)ビ^察 ACT_RU_TASK 表,就可以看到流程的執(zhí)行是否和我們所預(yù)想的一致。
并行網(wǎng)關(guān),從名字上大概也能看出來,這種網(wǎng)關(guān)一般用在并行任務(wù)上,并行網(wǎng)關(guān)如下圖:
并行網(wǎng)關(guān)一般是成對出現(xiàn)的,一個出現(xiàn)的并行網(wǎng)關(guān)用來分流,第二個出現(xiàn)的并行網(wǎng)關(guān)用來聚合。
我畫一個簡單的并行網(wǎng)關(guān)的例子,如下圖:
小伙伴們看到,這是一個簡化的生產(chǎn)筆記本的流程圖,當(dāng)屏幕和鍵盤都生產(chǎn)好之后,再進(jìn)行組裝,整個流程圖中存在兩個并行網(wǎng)關(guān)(成對出現(xiàn))。
在這個流程圖中,連接線上是不需要設(shè)置條件的(不同于拍他網(wǎng)關(guān)),這里即使你設(shè)置了條件,這個條件也是不會生效的。
我們來看下這個并行網(wǎng)關(guān)流程圖對應(yīng)的 XML 文件,如下:
測試流程
現(xiàn)在我們把這個流程部署并啟動。
流程啟動成功之后,我們發(fā)現(xiàn)在 ACT_RU_TASK 表中有兩個需要執(zhí)行的 Task,如下圖:
這兩個 Task,如果只執(zhí)行掉其中一個,那么還剩下另外一個 Task,如果兩個都執(zhí)行了,那么你就會看到一個新的 Task,如下圖(兩個并行任務(wù)執(zhí)行完成后,進(jìn)入到下一個任務(wù)):
好啦,這就是并行網(wǎng)關(guān)。
包容網(wǎng)關(guān),有時候也叫相容網(wǎng)關(guān)、兼容網(wǎng)關(guān)等,如下圖:
包容誰呢?包容排他網(wǎng)關(guān)和并行網(wǎng)關(guān)。也就是說,這種包容網(wǎng)關(guān)可以根據(jù)實(shí)際條件轉(zhuǎn)為排他網(wǎng)關(guān)或者并行網(wǎng)關(guān)。
舉個栗子:
假如說報(bào)銷金額大于 500,zhangsan 審批,報(bào)銷金額大于 1000,則需要 zhangsan 和 lisi 同時審批,且 zhangsan 和 lisi 審批無先后順序。
據(jù)此,我繪制如下流程圖:
在報(bào)銷金額大于 500 上設(shè)置如下條件:
大于 1000 上設(shè)置如下條件:
接下來我們來部署好這個流程。
部署好之后,我們首先來啟動流程,第一次啟動的時候,我們設(shè)置報(bào)銷金額為 666,如下:
@Test
void test01(){
Mapvariables = new HashMap<>();
variables.put("money", 666);
ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01", variables);
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}
流程啟動之后,我們在 ACT_RU_TASK 表中可以看到,該 zhangsan 審批了,如下:
zhangsan 審批之后,就是 wangwu 審批了,我就不演示了。
假設(shè)我們啟動流程的時候,報(bào)銷金額為 2000,如下:
@Test
void test01(){
Mapvariables = new HashMap<>();
variables.put("money", 2000);
ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01", variables);
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}
那么此時你就會看到,在 ACT_RU_TASK 表中,出現(xiàn)了兩條記錄,分別是 zhangsan 審批和 lisi 審批,此時這兩個審批就是一個并行任務(wù)了:
接下來就按并行任務(wù)的模式來,這兩個人都審批了,才會進(jìn)入到 wangwu 審批。
這就是兼容網(wǎng)關(guān)的特點(diǎn),即根據(jù)實(shí)際情況,會變成排他網(wǎng)關(guān)或者并行網(wǎng)關(guān)。
好啦,三種常見的網(wǎng)關(guān)就和小伙伴們分享完啦,感興趣的小伙伴趕緊試一試吧~