Flowable入门系列文章39 - 网关 01
網(wǎng)關(guān)用于控制執(zhí)行流程(或者BPMN 2.0描述的執(zhí)行令牌)。網(wǎng)關(guān)能夠消費(fèi)或生成令牌。
一個(gè)網(wǎng)關(guān)被圖形化地顯示為一個(gè)菱形,里面有一個(gè)圖標(biāo)。該圖標(biāo)顯示網(wǎng)關(guān)的類型。
 
1、獨(dú)家網(wǎng)關(guān)
描述
獨(dú)占網(wǎng)關(guān)(也稱XOR網(wǎng)關(guān)或更專業(yè)的基于數(shù)據(jù)的網(wǎng)關(guān))用于對(duì)流程中的決策進(jìn)行建模。當(dāng)執(zhí)行到達(dá)這個(gè)網(wǎng)關(guān)時(shí),所有流出的序列流將按照它們被定義的順序進(jìn)行評(píng)估。選擇條件評(píng)估為真的第一個(gè)序列流(或者沒(méi)有條件集,概念上在序列流中定義了“真”)被選擇用于繼續(xù)該過(guò)程。
請(qǐng)注意,在這種情況下,輸出序列流的語(yǔ)義與BPMN 2.0中的一般情況的語(yǔ)義不同。一般情況下,所有條件評(píng)估為真的序列流被選擇為以并行方式繼續(xù),而在使用專用網(wǎng)關(guān)時(shí)只選擇一個(gè)序列流。如果多個(gè)序列流具有評(píng)估為真的條件,則選擇在XML中定義的第一個(gè)(并且只有那個(gè)!)來(lái)繼續(xù)該過(guò)程。如果沒(méi)有順序流程可以選擇,將會(huì)拋出異常。
圖形表示法
獨(dú)家網(wǎng)關(guān)被視為一個(gè)典型的網(wǎng)關(guān)(菱形),里面有一個(gè)X圖標(biāo),指的是XOR語(yǔ)義。請(qǐng)注意,沒(méi)有圖標(biāo)的網(wǎng)關(guān)默認(rèn)為獨(dú)占網(wǎng)關(guān)。BPMN 2.0規(guī)范不允許在同一個(gè)進(jìn)程定義中使用有和沒(méi)有X的菱形塊。
 
 XML表示
獨(dú)占網(wǎng)關(guān)的XML表示法是直接的:一行定義在出站序列流上定義的網(wǎng)關(guān)和條件表達(dá)式。查看有關(guān)條件順序流程的部分,查看哪些選項(xiàng)可用于此類表達(dá)式。
以下面的模型為例:
 
其中用XML表示如下:
<exclusiveGateway id="exclusiveGw"name="Exclusive Gateway"/> <sequenceFlow id="flow2"sourceRef="exclusiveGw"targetRef="theTask1"> <conditionExpression xsi:type="tFormalExpression">${input==1}</conditionExpression> </sequenceFlow> <sequenceFlow id="flow3"sourceRef="exclusiveGw"targetRef="theTask2"> <conditionExpression xsi:type="tFormalExpression">${input==2}</conditionExpression> </sequenceFlow> <sequenceFlow id="flow4"sourceRef="exclusiveGw"targetRef="theTask3"> <conditionExpression xsi:type="tFormalExpression">${input==3}</conditionExpression> </sequenceFlow>2、并行網(wǎng)關(guān)
描述
網(wǎng)關(guān)也可以用來(lái)模擬進(jìn)程中的并發(fā)。最直接的網(wǎng)關(guān)中的過(guò)程模型介紹并發(fā)性,是并行網(wǎng)關(guān),它允許你叉成多個(gè)執(zhí)行路徑或加入執(zhí)行的多個(gè)傳入路徑。
并行網(wǎng)關(guān)的功能基于輸入和輸出序列流:
- fork:并行執(zhí)行所有外發(fā)序列流,為每個(gè)序列流創(chuàng)建一個(gè)并發(fā)執(zhí)行。
 - 連接:到達(dá)并行網(wǎng)關(guān)的所有并發(fā)執(zhí)行都在網(wǎng)關(guān)中等待,直到對(duì)每個(gè)傳入序列流執(zhí)行完畢。然后該過(guò)程繼續(xù)經(jīng)過(guò)加入的網(wǎng)關(guān)。
 
請(qǐng)注意,如果并行網(wǎng)關(guān)具有多個(gè)傳入和傳出序列流,并行網(wǎng)關(guān)可以同時(shí)具有分叉和連接行為。在這種情況下,網(wǎng)關(guān)將首先加入所有傳入的序列流,然后再分解為多個(gè)并發(fā)執(zhí)行路徑。
與其他網(wǎng)關(guān)類型的一個(gè)重要區(qū)別是并行網(wǎng)關(guān)不評(píng)估條件。如果在與并行網(wǎng)關(guān)連接的順序流上定義條件,則簡(jiǎn)單地忽略它們。
圖形表示法
一個(gè)并行網(wǎng)關(guān)可視化為帶有加號(hào)的網(wǎng)關(guān)(鉆石形狀),引用AND語(yǔ)義。
 
XML表示
定義并行網(wǎng)關(guān)需要一行XML:
<parallelGateway id="myParallelGateway" />實(shí)際行為(fork,join或both)由連接到并行網(wǎng)關(guān)的序列流定義。
例如,上面的模型歸結(jié)為以下XML:
<startEvent id="theStart" /> <sequenceFlow id="flow1" sourceRef="theStart" targetRef="fork" /> <parallelGateway id="fork" /> <sequenceFlow sourceRef="fork" targetRef="receivePayment" /> <sequenceFlow sourceRef="fork" targetRef="shipOrder" /> <userTask id="receivePayment" name="Receive Payment" /> <sequenceFlow sourceRef="receivePayment" targetRef="join" /> <userTask id="shipOrder" name="Ship Order" /> <sequenceFlow sourceRef="shipOrder" targetRef="join" /> <parallelGateway id="join" /> <sequenceFlow sourceRef="join" targetRef="archiveOrder" /> <userTask id="archiveOrder" name="Archive Order" /> <sequenceFlow sourceRef="archiveOrder" targetRef="theEnd" /> <endEvent id="theEnd" />在上面的例子中,過(guò)程開始后,將創(chuàng)建兩個(gè)任務(wù):
ProcessInstance pi=runtimeService.startProcessInstanceByKey("forkJoin");TaskQuery query=taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskName().asc();List<Task> tasks=query.list();assertEquals(2,tasks.size());Task task1=tasks.get(0);assertEquals("Receive Payment",task1.getName());Task task2=tasks.get(1);assertEquals("Ship Order",task2.getName());當(dāng)這兩個(gè)任務(wù)完成后,第二個(gè)并行網(wǎng)關(guān)將加入這兩個(gè)執(zhí)行,并且由于只有一個(gè)輸出序列流,因此不會(huì)創(chuàng)建并發(fā)執(zhí)行路徑,只有存檔命令任務(wù)處于活動(dòng)狀態(tài)。
請(qǐng)注意,并行網(wǎng)關(guān)不需要平衡(相應(yīng)并行網(wǎng)關(guān)的輸入/輸出序列流的匹配數(shù)量)。并行網(wǎng)關(guān)將簡(jiǎn)單地等待所有進(jìn)入的序列流,并為每個(gè)流出的序列流創(chuàng)建一個(gè)并發(fā)執(zhí)行路徑,而不受流程模型中其他構(gòu)造的影響。因此,以下過(guò)程在BPMN 2.0中是合法的:
 
上面文章來(lái)自盤古BPM研究院:http://vue.pangubpm.com/
 文章翻譯提交:https://github.com/qiudaoke/flowable-userguide
 了解更多文章可以關(guān)注微信公眾號(hào):
 
總結(jié)
以上是生活随笔為你收集整理的Flowable入门系列文章39 - 网关 01的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: 【集训日志】 金华集训
 - 下一篇: 互联网女皇玛丽·米克尔发布互联网新趋势报