2021-04-30
BPMN 2.0
BPMN 2.0介紹
定義一個(gè)流程
BPMN流程示例前提
目標(biāo)
用例
流程圖
XML內(nèi)容
啟動一個(gè)流程實(shí)例
任務(wù)列表
領(lǐng)取任務(wù)
完成任務(wù)
結(jié)束流程
源碼
總結(jié)

BPMN 2.0介紹
業(yè)務(wù)流程模型注解(BusinessProcess Modeling Notation - BPMN)是業(yè)務(wù)流程模型的一種標(biāo)準(zhǔn)圖形注解.這個(gè)標(biāo)準(zhǔn)是由對象管理組(Object Management Group - OMG)維護(hù)的
BPMN規(guī)范的2.0版本允許添加精確的技術(shù)細(xì)節(jié)在BPMN的圖形和元素中,同時(shí)制定BPMN元素的執(zhí)行語法.通過使用XML語言來指定業(yè)務(wù)流程的可執(zhí)行語法,BPMN規(guī)范已經(jīng)演變?yōu)闃I(yè)務(wù)流程的語言,可以執(zhí)行在任何兼容BPMN2的流程引擎中,同時(shí)依然可以使用強(qiáng)大的圖形注解
簡單來說,BPMN即圖標(biāo)與標(biāo)簽的結(jié)合
定義一個(gè)流程
創(chuàng)建一個(gè)新的XML文件并命名,確認(rèn)文件后綴為 .bpmn20.xml或 .bpmn, 否則引擎無法發(fā)布
BPMN 2.0根節(jié)點(diǎn)是definitions節(jié)點(diǎn). 這個(gè)元素中,可以定義多個(gè)流程定義(不過建議每個(gè)文件只包含一個(gè)流程定義, 可以簡化開發(fā)過程中的維護(hù)難度)
一個(gè)空的流程定義如下所示:注意definitions元素最少也要包含xmlns和 targetNamespace的聲明targetNamespace可以是任意值,它用來對流程實(shí)例進(jìn)行分類
可以選擇添加線上的BPMN 2.0格式位置
process元素有兩個(gè)屬性:
id: 這個(gè)屬性是必須的,對應(yīng)著Activiti ProcessDefinition對象的key屬性.id可以用來啟動流程定義的流程實(shí)例,通過RuntimeService的startProcessInstanceByKey方法
注意: 它和startProcessInstanceById方法不同:這個(gè)方法期望使用Activiti引擎在發(fā)布時(shí)自動生成的id.可以通過調(diào)用processDefinition.getId() 方法獲得這個(gè)值,生成的id的格式為 key:version, 最大長度限制為64個(gè)字符,如果在啟動時(shí)拋出了一個(gè)ActivitiException:說明生成的id太長了,需要限制流程的key的長度
name: 這個(gè)屬性是可選的, 對應(yīng)ProcessDefinition的name屬性.引擎自己不會使用這個(gè)屬性,是用來在用戶接口顯示便于閱讀的名稱

BPMN流程示例前提
已經(jīng)安裝Activiti并且能夠運(yùn)行Activiti Demo
使用了獨(dú)立運(yùn)行的H2服務(wù)器
修改db.properties,設(shè)置其中的jdbc.url=jdbc:h2:tcp://localhost/activiti,然后啟動獨(dú)立服務(wù)器
目標(biāo)
學(xué)習(xí)Activiti和一些基本的BPMN 2.0概念
最終結(jié)果是一個(gè)簡單的Java SE程序可以發(fā)布流程定義,通過Activiti引擎API操作流程
使用一些Activiti相關(guān)的工具,構(gòu)建自己的業(yè)務(wù)流程web應(yīng)用
用例
每個(gè)月都要給公司領(lǐng)導(dǎo)一個(gè)金融報(bào)表,由會計(jì)部門負(fù)責(zé)
當(dāng)報(bào)表完成時(shí),一個(gè)上級領(lǐng)導(dǎo)需要審批文檔,然后才能發(fā)給所有領(lǐng)導(dǎo)
流程圖
流程的圖形化BPMN 2.0標(biāo)記:
空開始事件(左側(cè)圓圈),后面是兩個(gè)用戶任務(wù):制作月度財(cái)報(bào)和驗(yàn)證月度財(cái)報(bào),最后是空結(jié)束事件(右側(cè)粗線圓圈)

XML內(nèi)容
在業(yè)務(wù)流程的XML中很容易找到流程的主要元素:(空)開始事件是流程的入口用戶任務(wù)是流程中與操作者相關(guān)的任務(wù)聲明:第一個(gè)任務(wù)分配給accountancy組第二個(gè)任務(wù)分配給management組當(dāng)流程達(dá)到空結(jié)束事件就會結(jié)束這些元素都使用連線連接,這些連線擁有source和target屬性,定義了連線的方向
啟動一個(gè)流程實(shí)例
創(chuàng)建好業(yè)務(wù)流程的流程定義,就可以創(chuàng)建流程實(shí)例
一個(gè)流程實(shí)例對應(yīng)了特定月度財(cái)報(bào)的創(chuàng)建和審批,所有流程實(shí)例都共享同一個(gè)流程定義
為了使用流程定義創(chuàng)建流程實(shí)例,首先要發(fā)布業(yè)務(wù)流程:
流程定義會保存到持久化的數(shù)據(jù)存儲里,是為Activiti引擎特別配置的.所以部署好業(yè)務(wù)流程,在引擎重啟后還能找到流程定義
BPMN 2.0流程文件會解析成內(nèi)存對象模型, 可以通過Activiti API操作
通過下面的API發(fā)布流程,所有與Activiti引擎的交互都是通過services
啟動一個(gè)新流程實(shí)例,使用我們定義在流程定義里的id(對應(yīng)XML文件中的process元素).注意這里的id對于Activiti來說,應(yīng)該叫做key,一般在流程模型中使用的ID,在Activiti中都是Key:比如任務(wù)ID
這樣創(chuàng)建一個(gè)流程實(shí)例:
首先進(jìn)入開始事件
開始事件之后,它會沿著所有的外出連線執(zhí)行,到達(dá)第一個(gè)任務(wù)(“制作月度財(cái)報(bào)”)
Activiti會把一個(gè)任務(wù)保存到數(shù)據(jù)庫里.這時(shí),分配到這個(gè)任務(wù)的用戶或群組會被解析,也會保存到數(shù)據(jù)庫里
需要注意,Activiti引擎會繼續(xù)執(zhí)行流程的環(huán)節(jié),除非遇到一個(gè) 等待狀態(tài):比如用戶任務(wù)
在等待狀態(tài)下,當(dāng)前的流程實(shí)例的狀態(tài)會保存到數(shù)據(jù)庫中.直到用戶決定完成任務(wù)才能改變這個(gè)狀態(tài)
這時(shí),引擎會繼續(xù)執(zhí)行,直到遇到下一個(gè)等待狀態(tài),或流程結(jié)束
如果中間引擎重啟或崩潰,流程狀態(tài)也會安全的保存在數(shù)據(jù)庫里
任務(wù)創(chuàng)建之后,startProcessInstanceByKey會在到達(dá)用戶任務(wù)這個(gè)等待狀態(tài)之后才會返回.這時(shí),任務(wù)分配給了一個(gè)組,這意味著這個(gè)組是執(zhí)行這個(gè)任務(wù)的候選組
現(xiàn)在將所有東西都放在一起,來創(chuàng)建一個(gè)簡單的java程序:創(chuàng)建一個(gè)Java項(xiàng)目,把Activiti的jar和依賴放到classpath下:這些都可以在Activiti發(fā)布包的libs目錄下找到在調(diào)用Activiti服務(wù)之前,我們必須構(gòu)造一個(gè)ProcessEngine,可以讓我們訪問服務(wù)這里我們使用[單獨(dú)運(yùn)行]的配置,這會使用demo安裝時(shí)的數(shù)據(jù)庫來構(gòu)建ProcessEngine
任務(wù)列表
可以通過TaskService來獲得任務(wù),添加邏輯
注意傳入的用戶必須是accountancy組的一個(gè)成員,要和流程定義中相對應(yīng)
也可以使用群組名稱,通過任務(wù)查詢API來獲得相關(guān)的結(jié)果.在代碼中添加如下邏輯:
因?yàn)榕渲玫腜rocessEngine使用了與demo相同的數(shù)據(jù),可以登錄到Activiti Explorer.默認(rèn),accountancy(會計(jì))組里沒有任何人:
登錄
點(diǎn)擊組
創(chuàng)建一個(gè)新組
點(diǎn)擊用戶
把組分配給fozzie
使用fozzie/fozzie登錄
就可以啟動我們的業(yè)務(wù)流程了,選擇Processes頁,在[月度財(cái)報(bào)]的[操作]列點(diǎn)擊[啟動流程]
流程會執(zhí)行到第一個(gè)用戶任務(wù).因?yàn)槲覀円詋ermit登錄,在啟動流程實(shí)例之后,就可以看到有了一個(gè)新的待領(lǐng)任務(wù).選擇任務(wù)頁來查看這條新任務(wù).注意即使流程被其他人啟動,任務(wù)還是會被會計(jì)組里的所有人作為一個(gè)候選任務(wù)看到
領(lǐng)取任務(wù)
現(xiàn)在一個(gè)會計(jì)要認(rèn)領(lǐng)這個(gè)任務(wù)
認(rèn)領(lǐng)以后,這個(gè)用戶就會成為任務(wù)的執(zhí)行人,任務(wù)會從會計(jì)組的其他成員的任務(wù)列表中消失.認(rèn)領(lǐng)任務(wù)的代碼
任務(wù)會進(jìn)入認(rèn)領(lǐng)任務(wù)人的個(gè)人任務(wù)列表
在Activiti Explorer UI中,點(diǎn)擊認(rèn)領(lǐng)按鈕,會執(zhí)行相同的操作.任務(wù)會移動到登錄用戶的個(gè)人任務(wù)列表.你也會看到任務(wù)的執(zhí)行人已經(jīng)變成當(dāng)前登陸的用戶:
完成任務(wù)
現(xiàn)在會計(jì)可以開始進(jìn)行財(cái)報(bào)的工作
報(bào)告完成后,他可以完成任務(wù),意味著任務(wù)所需的所有工作都完成
taskService.complete(task.getId());
對于Activiti引擎:需要一個(gè)外部信息來讓流程實(shí)例繼續(xù)執(zhí)行任務(wù)會把自己從運(yùn)行庫中刪除流程會沿著單獨(dú)一個(gè)外出連線執(zhí)行,移動到第二個(gè)任務(wù)(審批報(bào)告)與第一個(gè)任務(wù)相同的機(jī)制會使用到第二個(gè)任務(wù)上,不同的是任務(wù)是分配給management組
在demo中:
完成任務(wù)是通過點(diǎn)擊任務(wù)列表中的完成按鈕
因?yàn)镕ozzie不是會計(jì),我們先從Activiti Explorer注銷
然后使用kermit登陸(經(jīng)理),第二個(gè)任務(wù)會進(jìn)入未分配任務(wù)列表
結(jié)束流程
審批任務(wù)像之前一樣查詢和領(lǐng)取.
完成第二個(gè)任務(wù)會讓流程執(zhí)行到結(jié)束事件,就會結(jié)束流程實(shí)例
流程實(shí)例和所有相關(guān)的運(yùn)行數(shù)據(jù)都會從數(shù)據(jù)庫中刪除
登錄Activiti Explorer就可以進(jìn)行驗(yàn)證,可以看到保存流程運(yùn)行數(shù)據(jù)的表中已經(jīng)沒有數(shù)據(jù):
可以使用historyService判斷流程是否已經(jīng)結(jié)束
源碼
考慮到你可能會在Activiti Explorer UI中啟動一些流程實(shí)例,這樣,它會獲得多個(gè)任務(wù),而不是一個(gè),所以代碼可以一直正常運(yùn)行:
總結(jié)
可以通過Activiti中的BPMN 2.0結(jié)構(gòu),對業(yè)務(wù)流程進(jìn)行以下方面的:
定義網(wǎng)關(guān)來實(shí)現(xiàn)決策環(huán)節(jié): 經(jīng)理可以駁回財(cái)報(bào),重新給會計(jì)創(chuàng)建一個(gè)任務(wù)
考慮使用變量: 可以保存或引用報(bào)告,把它顯示到表單中
在流程最后加入服務(wù)任務(wù): 把報(bào)告發(fā)給每個(gè)領(lǐng)導(dǎo)
——END——
更多網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)等相關(guān)內(nèi)容,歡迎您咨詢中山網(wǎng)訊科技!
責(zé)任編輯:中山網(wǎng)站建設(shè)
【網(wǎng)訊網(wǎng)絡(luò)】國家高新技術(shù)企業(yè)》十二年專注軟件開發(fā),網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),APP開發(fā),小程序,微信公眾號開發(fā),定制各類企業(yè)管理軟件(OA、CRM、ERP、OMS訂單管理系統(tǒng)、WMS進(jìn)銷存管理軟件等)!服務(wù)熱線:0760-88610046、13924923903,http://www.denorpool.com
*請認(rèn)真填寫需求,我們會在24小時(shí)內(nèi)與您取得聯(lián)系。