基本概念:
對業務流程管理(Business process management)進行建模稱為業務流程建模(Business Process Model),業務流程建模語言BPMN(Business Process Model Notation)是其一種建模語言,而BPMN2.0規范(Business Process Model and Notation 2.0)是基於BPMN的一套標准,對BPMN進行了重新的定義。
BPMN的價值:
BPMN的開發旨在減少眾多已存在的業務建模工具和流程記錄工具之間的斷層。
BPMN2-Conformance 一致性:
- Process Modeling Conformance 流程模型一致性
- Process Execution conformance 流程執行一致性
- BPEL Process Execution Conformance BPEL 流程執行一致性
- Choreography Modeling Conformance 編排模型一致性
BPMN2-Element 元素:
- Flow Objects 流對象(三個核心元素)
1) Events 事件(用於對流程生命周期中發生的事件進行建模。)
Event 用一個圓圈表示,它是流程中運行過程中發生的事情。事件的發生會影響到流程的流轉.事件包含Start\Intermediate\End三種類型。
2) Activities 活動(任務表示流程中具體要做的事情,通常一個任務表示工作需要被外部實體完成,比如人工任務和自動服務。)
活動用圓角矩形表示,一個活動多個活動組成,活動的類型分為Task和Sub-Process。
3) Gateways 網關(用來控制流程的流向)
網關用菱形表示,用於控制流程的分支和聚合。
現實業務所有的業務環節都離不開Activities、Gateways和Events,無論是簡單的條件審批還是復雜的父子流程循環處理,在一個流程定義描述中,所有的業務環節都離不開Task、Sequence Flow、Exclusive Gateway、Inclusive Gateway(如圖1中右側綠色標記所示元素),其中Task是一個極具威力的元素,它能描述業務過程中所有能發生工時的行為,它包括User Task、Manual Task、Service Task、Script Task等,可以被用來描述人機交互任務、線下操作任務、服務調用、腳本計算任務等常規功能。
User Task:生成人機交互任務,主要被用來描述需要人為在軟件系統中進行諸如任務明細查閱、填寫審批意見等業務行為的操作,流程引擎流轉到此類節點時,系統會自動生成被動觸發任務,須人工響應后才能繼續向下流轉。常用於審批任務的定義。
Manual Task:線下人為操作任務,常用於為了滿足流程圖對實際業務定義的完整性而進行的與流程驅動無關的線下任務,即此類任務不參與實際工作流流轉。常用於諸如物流系統中的裝貨、運輸等任務的描述。
Service Task:服務任務,通常工作流流轉過程中會涉及到與自身系統服務API調用或與外部服務相互調用的情況,此類任務往往由一個具有特定業務服務功能的Java類承擔,與User Task不同,流程引擎流經此節點會自動調用Java類中定義的方法,方法執行完畢自動向下一流程節點流轉。另外,此類任務還可充當“條件路由”的功能對流程流轉可選分支進行自動判斷。常用於業務邏輯API的調用。
Script Task:腳本任務,在流程流轉期間以“腳本”的聲明或語法參與流程變量的計算,目前支持的腳本類型有三種:juel(即JSP EL)、groovy和javascript。在Activiti5.9中新增了Shell Task,可以處理系統外部定義的Shell腳本文件,也與Script Task有類似的功能。常用於流程變量的處理。
2. Data 數據
1) Data Objects 數據對象
2) Data Inputs 數據輸入
3) Data OutPuts 數據輸出
4) Data Stores 數據存儲
3. Connecting Objects 連接對象
1) Sequence Flows 序列流
Sequence Flows 用實線實心箭頭表示,代表流程中將被執行的活動的執行順序。
2) Message Flows 消息流
Message Flows 用虛線空心箭頭表示,第阿寶2個分開的流程參與者直接發送或者接收到的消息流.
3) Associations 結合關系
Associations 用點狀虛線表示,用於顯示活動的輸入輸出.
4) Data Associations 數據結合關系
4. Swimlanes 泳道
1) Pools 池
池描述流程中的一個參與者。可以看做是將一系列活動區別於其他池的一個圖形容器,一般用於B2B的上下文中
2) Lanes 道
道就是在池里面再細分,可以是垂直的也可以是水平的。道也是用於組織和分類活動。
5. Artifacts 工件
1) Group 組
2) Text Annotation 文本注釋
BPMN2-Diagram Types 圖類型:
- Private Processes 私有流程
- Public Processes 共有流程
- Choreographies Processes 組合流程
什么是工作流引擎:
工作流引擎是一個用於管理和調度流程的應用程序,可以集成並作為程序框架使用,包括流程定義的存儲,流程的節點與流程條件判斷和調度、流向管理、流程實例管理等功能。
工作流引擎與BPMN有什么關系:
通過BPMN(業務流程建模語言)來進行BPM(業務流程建模)得到的結果就是業務流程的定義,它規定了業務的流轉過程由誰參與等等。而協調並執行這個流程,記錄流程的執行過程和結果就是工作流引擎的職責范圍了。
工作流引擎:
Activiti:
BPMN2.0的基本元素:
- 順序流(sequence flow)
順序流是流程中兩個元素間的連接器。順序流就是事件,活動和網關之間的連線,顯示為一條實線帶有箭頭,在BPMN圖形中每個順序流都有一個源頭和一個目標引用,包含了活動,事件或網關的id。在流程執行過程中,一個元素被訪問后,會沿着其所有出口順序流繼續執行。這意味着BPMN 2.0的默認是並行執行的:兩個出口順序流就會創建兩個獨立的、並行的執行路徑。
<sequenceFlow id="myFlow" name="MyFlow" sourceRef="sourceId" targetRef="targetId" /> |
用從源元素指向目標元素的箭頭表示。箭頭總是指向目標元素。
1) 條件順序流
在順序流上可以定義條件(conditional sequence flow),默認行為是計算其每個出口順序流上的條件。當條件計算為true時,選擇該出口順序流。條件順序流的XML表示格式為含有conditionExpression(條件表達式)子元素的普通順序流。
<sequenceFlow id="flow" sourceRef="theStart" argetRef="theTask"> <conditionExpression xsi:type="tFormalExpression"> <![CDATA[${order.price > 100 && order.price < 250}]]> </conditionExpression> </sequenceFlow> |
2) 默認順序流
所有BPMN 2.0任務和網關都可以具有默認序列流。當且僅當其他條件順序流都為false時,才選擇執行默認順序流。默認序列流的條件總是被忽略。
<exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" default="flow2" /> <sequenceFlow id="flow1" sourceRef="exclusiveGw" targetRef="task1"> <conditionExpression xsi:type="tFormalExpression"> ${conditionA} </conditionExpression> </sequenceFlow> <sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="task2"/> <sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="task3"> <conditionExpression xsi:type="tFormalExpression"> ${conditionB} </conditionExpression> </sequenceFlow> </exclusiveGateway> |
- 活動(任務)
1) 用戶任務
用戶任務(user task)用於對需要人工執行的任務進行建模。當流程執行到達用戶任務時,會為指派至該任務的用戶或組的任務列表創建一個新任務。
用戶任務用左上角有一個小用戶圖標的標准任務(圓角矩形)表示。
id是必須的,name是可選的,通過documentation元素對任務進行描述。任何bpmn2.0元素都可用documentation元素進行描述。
<userTask id="theTask" name="Schedule meeting" > <documentation> Schedule an engineering meeting for next week with the new hire. </documentation> </userTask> |
到期日:可通過dueDate字段設置任務的到期時間。
用戶分配
人工任務可分配給三種人:assignee(辦理人、受讓人),candidate(候選人),candidateGroup(候選人組)。assignee是任務的實際辦理人,任務只能同時有一個辦理人。任務可以有多個候選人,每個候選人都能看到該任務,候選人需要claim(拾取)任務成為assignee后,才能進行任務的辦理,任務被拾取后其他候選人就看不到該任務了。候選人在拾取任務后可以unclaim,將任務歸還,此時其他候選人可以看到並claim任務。不想單獨指定多個候選人,可以指定一個候選人組,一般為角色ID。
分配方式有三種:1)畫圖時寫死。2)通過UEL表達式動態設置。3)通過TaskListener監聽器指定。
<userTask id="task1" name="My task" > <extensionElements> <flowable:taskListener event="create" class="org.flowable.MyAssignmentHandler" /> </extensionElements> </userTask> |
2) 服務任務
服務任務(service task)用於調用Java類。流程執行到服務任務時,會自動運行Java程序中的代碼流程。
服務任務用左上角有一個小齒輪圖標的圓角矩形表示。
<serviceTask id="javaService" name="My Java Service Task" flowable:class="com.inossem.MyJavaDelegate" /> |
或使用表達式,結合spring的IOC機制,如下使用。
<serviceTask id="serviceTask" flowable:delegateExpression="${springBeanName}" /> |
3) 腳本任務
用於執行腳本文件(如javascript)。
<scriptTask id="theScriptTask" name="Execute script" scriptFormat="groovy"> <script> sum = 0 for ( i in inputArray ) { sum += i } </script> </scriptTask> |
- 網關(節點)
1) 排他網關
排他網關(exclusive gateway)(也叫異或網關 XOR gateway,或者更專業的,基於數據的排他網關 exclusive data-based gateway),用於對流程中的決策建模。當執行到達這個網關時,會按照所有出口順序流定義的順序對它們進行計算。選擇第一個條件計算為true的順序流(當沒有設置條件時,認為順序流為true)繼續流程。
排他網關用內部帶有‘X’圖標的標准網關(菱形)表示,‘X’圖標代表異或的含義。請注意內部沒有圖標的網關默認為排他網關。BPMN 2.0規范不允許在同一個流程中混合使用有及沒有X的菱形標志。
<exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" /> |
2) 並行網關
網關也可以建模流程中的並行執行。在流程模型中引入並行的最簡單的網關,就是並行網關(parallel gateway)。它可以將執行分支(fork)為多條路徑,也可以合並(join)多條入口路徑的執行。
並行網關的功能取決於其入口與出口順序流:
分支:所有的出口順序流都並行執行,為每一條順序流創建一個並行執行。
合並:所有到達並行網關的並行執行都會在網關處等待,直到每一條入口順序流都到達了有個執行。然后流程經過該合並網關繼續。
如果並行網關同時具有多條入口與出口順序流,可以同時具有分支與合並的行為。在這種情況下,網關首先合並所有入口順序流,然后分裂為多條並行執行路徑。
與其他網關類型有一個重要區別:並行網關不計算條件。如果連接到並行網關的順序流上定義了條件,會直接忽略該條件。
並行網關,用內部帶有‘加號’圖標的網關(菱形)表示,代表與(AND)的含義。
<parallelGateway id="myParallelGateway" /> |
3) 包含網關
看作是排他網關和並行網關的組合,包含網關既能進行條件判斷,又能並行執行多個分支。
<inclusiveGateway id="myInclusiveGateway" /> |
4. 事件
1) 啟動&結束事件
啟動事件(start event)是流程的起點。啟動事件的類型(流程在消息到達時啟動,在指定的時間間隔后啟動,等等),定義了流程如何啟動,並顯示為啟動事件中的小圖標。在XML中,類型由子元素聲明來定義。
啟動事件可以有多種類型,如:空啟動事件、定時器啟動事件、消息啟動事件、信號啟動事件、錯誤啟動事件等。
<startEvent id="start" name="my start event" /> |
結束事件(end event)標志着流程或子流程中一個分支的結束。結束事件總是拋出型事件。這意味着當流程執行到達結束事件時,會拋出一個結果。結果的類型由事件內部的黑色圖標表示。結束事件同樣有多種類型。
<endEvent id="end" name="my end event" /> |
2) 邊界事件
邊界事件(boundary event)是捕獲型事件,依附在活動(activity)上。邊界事件永遠不會拋出。這意味着當活動運行時,事件將監聽特定類型的觸發器。當捕獲到事件時,會終止活動,並沿該事件的出口順序流繼續。
錯誤邊界事件用內部有一個錯誤圖標的標准中間事件(兩層圓圈)表示。錯誤圖標是白色的,代表捕獲的含義。
3) 拋出&捕獲事件
捕獲中間事件用內部有對應事件圖標的標准中間事件(兩層圓圈)表示。圖標是白色的(未填充),代表捕獲的含義。
拋出中間事件用內部有對應事件圖標的標准中間事件(兩層圓圈)表示。圖標是黑色的(已填充),代表拋出的含義。
5. 子流程與調用活動
1) 子流程
在BPM表中有子流程和引用活動的概念,如果一個流程在多個環節中使用,那么就可以考慮將該流程拆分為一個獨立的子流程,這樣其他的流程引入該流程就可以。子流程和引用活動的目的是簡化繁瑣重復流程的配置,也便於在流程圖中對整個環節進行跟蹤。
子流程有兩個主要的使用場景:
子流程可以分層建模。很多建模工具都可以折疊子流程,隱藏子流程的所有細節,而只顯示業務流程的高層端到端總覽。
子流程會創建新的事件范圍。在子流程執行中拋出的事件可以通過子流程邊界上的邊界事件捕獲,為該事件創建了限制在子流程內的范圍。
使用子流程也要注意以下幾點:
子流程只能有一個空啟動事件,而不允許有其他類型的啟動事件。請注意BPMN 2.0規范允許省略子流程的啟動與結束事件。
順序流不能跨越子流程邊界。
子流程表示為標准活動(圓角矩形)。若折疊了子流程,則只顯示其名字與一個加號,以展示流程的高層概覽。
若展開了子流程,則在子流程內顯示子流程的所有步驟。
2) 調用活動
圖示上看起來很相像子流程,但在BPMN 2.0中,調用活動(call activity)有別於一般的子流程(子流程通常也稱作嵌入式子流程)。從概念上說,兩者都在流程執行到達該活動時,調用一個子流程。
兩者的區別為,調用活動引用一個流程定義外部的流程,而子流程嵌入在原有流程定義內。調用活動的主要使用場景是,在多個不同流程定義中調用一個可復用的流程定義。
當流程執行到達調用活動時,會創建一個新的執行,作為到達調用活動的執行的子執行。這個子執行用於執行子流程,也可用於創建並行子執行(與普通流程中行為類似)。父執行將等待子流程完成,之后沿原流程繼續執行。
調用過程表現為帶有粗邊框(折疊與展開都是)的子流程。取決於建模工具,調用過程可以展開,但默認表現為折疊形式。
BPMN2.0流程示例:
BPMN2.0請假流程定義
請假流程所用圖元