流程定義語言(BPMN)

流程定義語言(BPMN)

1.什麼是BPMN

業務流程建模與標註(Business Process Model and Notation,BPMN) ,描述流程的基本符號,包括這些圖元如何組合成一個業務流程圖(Business Process Diagram)

Eclispse畫出流程,有兩個文件bpmn文件和png文件,其中bpmn文件又可以叫做流程定義文件,它需要遵循BPMN語言規範.png:就是一個單純的圖片,沒有任何作用.

2.什麼是流程

bpmn文件一個流程的根元素。一個流程就代表一個工作流。

3.順序流(sequenceFlow)

3.1什麼是順序流
順序流是連接兩個流程節點的連線,代表一個節點的出口。流程執行完一個節點後,會沿着節點的所有外出順序流繼續執行。 就是說,BPMN 2.0默認的行爲就是併發的: 兩個外出順序流會創造兩個單獨的,併發流程分支。
3.2順序流的屬性
Id: 唯一標示,用來區分不同的順序流
sourceRef:連線的源頭節點ID
targetRef:連線的目標節點ID
name(可選):連線的名稱,不涉及業務,主要用於顯示。多出口原則要設置。
3.3分支流程流程圖
在這裏插入圖片描述

準備開啓流程

請假人設置請假天數
/**
* zs 完成任務
* @throws Exception
/
@Test
public void compleTask() throws Exception {
Map<String, Object>map=new HashMap<>();
map.put(“days”, 2);
compleTaskByPIdAndName(“2501”, “zs”,map);
}
//審批人審覈,判斷
/
*
* ls 完成任務
* @throws Exception
*/
@Test
public void compleTaskls() throws Exception {
//String taskId=“5003”;
String pid=“2501”;
String name=“ls”;
Map<String, Object> variables = taskService.getVariables(queryTaskByName(pid, name).getId());
// 獲取天數
Integer days = (Integer) variables.get(“days”);
System.out.println(days>3);
if(days>3){
variables.put(“flag”, false);
}else{
variables.put(“flag”, true);
}
System.out.println(variables);
// 完成任務
//taskService.complete(taskId,variables);
compleTaskByPIdAndName(pid, name,variables);
}

4.網關節點

網關用來控制流程的流向。
網關顯示成菱形圖形,內部有有一個小圖標。 圖標表示網關的類型。
在這裏插入圖片描述
4.1排他網關(ExclusiveGateWay)
簡單理解有多個分支,但是隻能走一個分支。
排他網關(也叫異或(XOR)網關,或更技術性的叫法 基於數據的排他網關), 用來在流程中實現決策。
圖形標記
排他網關顯示成一個普通網關(比如,菱形圖形), 內部是一個“X”圖標,表示異或(XOR)語義。 注意,沒有內部圖標的網關,默認爲排他網關。 BPMN 2.0規範不允許在同一個流程定義中同時使用沒有X和有X的菱形圖形。

XML內容
排他網關的XML內容是很直接的:用一行定義了網關, 條件表達式定義在外出順序流中。 參考條件順序流 獲得這些表達式的可用配置。

它對應的XML內容如下:
在這裏插入圖片描述
說明:
1.一個排他網關對應一個以上的順序流
2.由排他網關流出的順序流都有個conditionExpression元素,在內部維護返回boolean類型的決策結果。
3.決策網關只會返回一條結果。當流程執行到排他網關時,流程引擎會自動檢索網關出口,從上到下檢索如果發現第一條決策結果爲true或者沒有設置條件的(默認爲成立),則流出。
4.如果沒有任何一個出口符合條件則拋出異常。

4.2並行網關(parallelGateWay)
多個分支要一起執行完,纔算完成(會籤)。
網關也可以表示流程中的並行情況。最簡單的並行網關是parallelGateWay,它允許將流程 分成多條分支,也可以把多條分支 匯聚到一起。
圖形標記
並行網關顯示成一個普通網關(菱形)內部是一個“加號”圖標, 表示“與(AND)”語義。
在這裏插入圖片描述
XML內容
定義並行網關只需要一行XML:

實際發生的行爲(分支,聚合,同時分支聚合), 要根據並行網關的順序流來決定。
參考如下代碼:

<sequenceFlow id="flow1"sourceRef="theStart"targetRef=“fork”/> <parallelGatewayid=“fork”/> <sequenceFlowsourceRef="fork"targetRef=“receivePayment”/> <sequenceFlowsourceRef="fork"targetRef=“shipOrder”/>
<userTaskid="receivePayment"name=“Receive Payment”/> <sequenceFlowsourceRef="receivePayment"targetRef=“join”/>
<userTaskid="shipOrder"name=“Ship Order”/> <sequenceFlowsourceRef="shipOrder"targetRef=“join”/> <parallelGatewayid=“join”/> <sequenceFlowsourceRef="join"targetRef=“archiveOrder”/>
<userTaskid="archiveOrder"name=“Archive Order”/> <sequenceFlowsourceRef="archiveOrder"targetRef=“theEnd”/>
<endEventid=“theEnd”/>
上面例子中,流程啓動之後,會創建兩個任務:
ProcessInstancepi =runtimeService.startProcessInstanceByKey(“forkJoin”);
TaskQueryquery=taskService.createTaskQuery() .processInstanceId(pi.getId()) .orderByTaskName().asc();
Listtasks =query.list();
assertEquals(2,tasks.size()); Task task1 =tasks.get(0);
assertEquals(“Receive Payment”,task1.getName());Tasktask2 =tasks.get(1);
assertEquals(“Ship Order”,task2.getName());
當兩個任務都完成時,第二個並行網關會匯聚兩個分支,因爲它只有一條外出連線, 不會創建並行分支, 只會創建歸檔訂單任務。
說明:
1.並行網關的功能是基於進入和外出的順序流的:
分支(fork): 並行後的所有外出順序流,爲每個順序流都創建一個併發分支。
匯聚(join): 所有到達並行網關,在此等待的進入分支, 直到所有進入順序流的分支都到達以後, 流程就會通過匯聚網關。
2.並行網關的進入和外出都是使用相同節點標示
3.如果同一個並行網關有多個進入和多個外出順序流, 它就同時具有分支和匯聚功能。 這時,網關會先匯聚所有進入的順序流,然後再切分成多個並行分支。
4.並行網關不會解析條件。 即使順序流中定義了條件,也會被忽略。
並行網關不需要是“平衡的”(比如, 對應並行網關的進入和外出節點數目相等)。如圖中標示是合法的:

5.執行監聽器(ExecutionListener)

執行監聽器可以執行外部java代碼或執行表達式,當流程定義中發生了某個事件。 可以捕獲的事件有:
流程實例的啓動和結束。
選中一條連線。
節點的開始和結束。
網關的開始和結束。
中間事件的開始和結束。
開始時間結束或結束事件開始。
現在有這樣一個簡單流程,只包含開始、結束、接收任務和用戶任務4個節點:
在這裏插入圖片描述
配置監聽器,XML代碼如下:
在這裏插入圖片描述
說明:
1.任務監聽器支持以下屬性:
event(必選):任務監聽器會被調用的任務類型。 可能的類型爲:
start:流程節點創建後觸發。
end:當任務完成,並尚未從運行數據中刪除時觸發。
take:任務完成後,流程流出時觸發
class:必須調用的代理類。 這個類必須實現org.activiti.engine.delegate.
ExecutionListener接口。實現類代碼如下:
在這裏插入圖片描述
執行監聽器配置可以放在以下三個地方,如圖:
在這裏插入圖片描述
a)監聽整個流程的啓動和結束狀態,配置爲process節點的子元素,如圖①
b)監聽一個節點的啓動和結束狀態,配置爲一個節點的子元素,如圖②和③
c)監聽一條連線的執行,配置在sequenceFlow節點的內部,只有task一種事件,如圖④
啓動流程測試代碼如下:
在這裏插入圖片描述
結果如下:
在這裏插入圖片描述

6.任務監聽器(TaskListener)

任務監聽器可以在發生對應的任務相關事件時執行自定義java邏輯 或表達式。
任務監聽器只能添加到流程定義中的用戶任務中。在之前任務節點上添加任務監聽:

在這裏插入圖片描述

說明:
1.任務監聽器支持以下屬性:
event(必選):任務監聽器會被調用的任務類型。 可能的類型爲:
create:任務創建並設置所有屬性後觸發。
assignment:任務分配給一些人時觸發。 當流程到達userTask,assignment事件 會在create事件之前發生。 這樣的順序似乎不自然,但是原因很簡單:當獲得create時間時, 我們想獲得任務的所有屬性,包括執行人。
complete:當任務完成,並尚未從運行數據中刪除時觸發。
class:必須調用的代理類。 這個類必須實現org.activiti.engine.delegate.TaskListener 接口。Java代碼如下:
在這裏插入圖片描述
2.運行測試代碼得到結果:
流程結束,日誌內容爲:[Start start, Receive Task start, Receive Task end, Receive Task take, User Task start, User Task assignment, User Task create, User Task complete, User Task end, End end]
新添加的任務監聽包裹在executionListener監聽的內部,順序爲:execution Start–> task Assignment–>task Create–>task Complete–>execution End–>execution take。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章