Flowable入门系列文章39 - 网关 01
網關用于控制執行流程(或者BPMN 2.0描述的執行令牌)。網關能夠消費或生成令牌。
一個網關被圖形化地顯示為一個菱形,里面有一個圖標。該圖標顯示網關的類型。
1、獨家網關
描述
獨占網關(也稱XOR網關或更專業的基于數據的網關)用于對流程中的決策進行建模。當執行到達這個網關時,所有流出的序列流將按照它們被定義的順序進行評估。選擇條件評估為真的第一個序列流(或者沒有條件集,概念上在序列流中定義了“真”)被選擇用于繼續該過程。
請注意,在這種情況下,輸出序列流的語義與BPMN 2.0中的一般情況的語義不同。一般情況下,所有條件評估為真的序列流被選擇為以并行方式繼續,而在使用專用網關時只選擇一個序列流。如果多個序列流具有評估為真的條件,則選擇在XML中定義的第一個(并且只有那個!)來繼續該過程。如果沒有順序流程可以選擇,將會拋出異常。
圖形表示法
獨家網關被視為一個典型的網關(菱形),里面有一個X圖標,指的是XOR語義。請注意,沒有圖標的網關默認為獨占網關。BPMN 2.0規范不允許在同一個進程定義中使用有和沒有X的菱形塊。
XML表示
獨占網關的XML表示法是直接的:一行定義在出站序列流上定義的網關和條件表達式。查看有關條件順序流程的部分,查看哪些選項可用于此類表達式。
以下面的模型為例:
其中用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、并行網關
描述
網關也可以用來模擬進程中的并發。最直接的網關中的過程模型介紹并發性,是并行網關,它允許你叉成多個執行路徑或加入執行的多個傳入路徑。
并行網關的功能基于輸入和輸出序列流:
- fork:并行執行所有外發序列流,為每個序列流創建一個并發執行。
- 連接:到達并行網關的所有并發執行都在網關中等待,直到對每個傳入序列流執行完畢。然后該過程繼續經過加入的網關。
請注意,如果并行網關具有多個傳入和傳出序列流,并行網關可以同時具有分叉和連接行為。在這種情況下,網關將首先加入所有傳入的序列流,然后再分解為多個并發執行路徑。
與其他網關類型的一個重要區別是并行網關不評估條件。如果在與并行網關連接的順序流上定義條件,則簡單地忽略它們。
圖形表示法
一個并行網關可視化為帶有加號的網關(鉆石形狀),引用AND語義。
XML表示
定義并行網關需要一行XML:
<parallelGateway id="myParallelGateway" />實際行為(fork,join或both)由連接到并行網關的序列流定義。
例如,上面的模型歸結為以下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" />在上面的例子中,過程開始后,將創建兩個任務:
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());當這兩個任務完成后,第二個并行網關將加入這兩個執行,并且由于只有一個輸出序列流,因此不會創建并發執行路徑,只有存檔命令任務處于活動狀態。
請注意,并行網關不需要平衡(相應并行網關的輸入/輸出序列流的匹配數量)。并行網關將簡單地等待所有進入的序列流,并為每個流出的序列流創建一個并發執行路徑,而不受流程模型中其他構造的影響。因此,以下過程在BPMN 2.0中是合法的:
上面文章來自盤古BPM研究院:http://vue.pangubpm.com/
文章翻譯提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以關注微信公眾號:
總結
以上是生活随笔為你收集整理的Flowable入门系列文章39 - 网关 01的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【集训日志】 金华集训
- 下一篇: 互联网女皇玛丽·米克尔发布互联网新趋势报