BPMN 和 Activiti 介紹
工作流介紹
在任何行業和企業中,都有各種各樣的流程,例如:
- 請假流程
- 報銷流程
- 入職流程
- 離職流程
- 出差流程
- 等等……
就算你自己沒有設計過工作流,那麼你每天肯定也在使用各種流程。
為什麼要用 BPMN ?
對於流程控制,有一種比較初級的玩法是:在業務程式碼裡面加入 Status(狀態機)
欄位維護流程狀態,流程負責的審批人可能也是 Hard Code(硬編碼)
,這種玩法實現流程初級會比較快,但是長遠來看會出現幾個問題:
- 流程健壯性差,但凡出現人員變動,或者組織結構調整,就需要修改程式碼,維護成本高
- 流程無法複用,當組織出現新的工作流程,又要重新寫一套程式碼,開發成本非常高
- 流程和業務程式碼耦合,你中有我,我中有你(並不符合單一職責和解耦的設計原則)
BPMN:業務流程模型和標記法 工作流(Workflow)是對各個行業的流程進行抽象,例如電信、軟體、製造、金融和辦公自動化領域。為了給全部業務的參與者提供易於理解的標準標記法,由業務流程管理倡議組織 BPMI 開發出了“業務流程建模標記法” Business Process Modeling Notation, BPMN。 BPMI 組織 於 2005 年併入 OMG 國際規範組織(Object Management Group),當前 BPMN 規範由 OMG 組織進行維護。
為什麼要遵循規範 ?
遵循市場行為
舉例:我們日常的電池 ? 有 7 號和 5 號標準,你當然可以生產一個 6 號的電池,有沒有人買就沒人知道了,如果你按標準生產出的電池,那麼是可以直接用到大多數電器上,如果你生產 6 號電池,那麼你只能自己開發 6 號電池的電器,且不說你這樣的做法是否被市場和行業認可,另外搞那麼多不同的標準出來對於消費者來說也是一種災難,例如當年微軟的 IE 和 FireFox 的兩套標準讓現在的開發人員多麼痛苦就知道了。。
遵循行業的共識
目前主流的工作流廠商都是基於 BPMN 2.0 規範開發流程,想要自立規範之前也請完全掌握和了解目前的規範。
另外對於產品和業務人員也需要學習和理解 BPMN 的符號,從而可以對業務進行建模,可以看看人人都是產品經歷這篇文章: 關於 BPMN 流程建模方法 ,從而可以利用現有的 BPMN 流程設計器工具快速對業務建模(無需自己開發),只需將匯出的 *.bpmn
檔案匯入遵循 BPMN 規範的流程引擎內即可執行。充分利用行業的生態和工具。這就是遵循規範所帶來的收益。
有沒有銀彈 ? (BPMN 的適用場景)
我們知道軟體行業是沒有銀彈,任何工具都有適用場景,如果把一個工具放到一個不適應的場景內,那麼最終起到事倍功半的效果,流程引擎也不是銀彈,它是一個對於複雜流程和抽象和複用工具,對於那些工作流程多且複雜的業務系統,合理的使用流程引擎會大大降低我們對於工作流的開發成本和時間,並且最終交付的效果也會比自己開發流程引擎要好上許多。
但是如果你的業務系統沒有那麼多的工作流程,或者只有很簡單的狀態從 A -> B 的轉移,那麼引入流程引擎顯然是 大馬拉小車
,費時費力不說,而且會造成簡單的需求開發起來很麻煩,拉長開發週期時間,最終交付的效果也未必很好。所以選擇合適的工具,就成了程式設計師最重要的選擇。
Activiti 是應對大型系統的複雜流程的作戰工具,小規模場景和流程不復雜的業務系統,不建議使用。
本章總結:為什麼要用工作流引擎 ?
- 自行研發流程,把流程和業務耦合不僅導致程式碼開發、修改成本高,而且流程偏定製開發,無法複用,就好比你自己生產一個 6 號電池 ?
- 通過流程引擎,可以以極低的成本,快速實現業務工作流,提高開發效率,而且久經生產考驗的流程引擎,也比任何人從 0 開始寫流程要可靠的多,流程引擎的功能並沒有多特別,都可以通過邏輯程式碼實現的,流程引擎的核心功能在於高質量的複用,設計層面的解耦(設計思想,語言和技術棧無關)
- BPMN2.0 是行業規範,遵循行業標準,有眾多成熟工具可以使用,例如 bpmn 流程設計工具等等……系統需要實現的工作流越多,使用工作流的收益就越大
- 流程引擎不是銀彈,它只適用於工作流程多且複雜的大型業務系統,如果是流程邏輯簡單的業務系統,那麼不建議使用流程引擎
BPMN 規範介紹
由於 BPMN 1.0 規範廣受歡迎,OMG (Object Management Group) 組織於2011年1月釋出 BPMN 2.0 規範,BPMN 2.0 版本則繼承了 1.0 版本的內容,並且注重流程執行語法和標準交換格式。
OMG 組織致力於維護 BPMN 規範的兩個目標:
- 流程的可遷移性:BPMN 2.0 規範定義了業務流程的符號以及模型,並且為流程定義設定了轉換格式,目的是為了讓流程的定義實現可移植性,那麼使用者可以在不同的供應商環境中定義流程,並且這些 流程可以移植到其他遵守 BPMN 2.0 規範的供應商環境中。
- 解決簡單和複雜的平衡:BPMN 想要解決流程設計和複雜需求中間尋找一個平衡點,可以讓非技術人員建立簡單並且易懂的業務流程模型,同時可以處理高度複雜的業務流程,因此要解決這兩個矛盾的要求,需要在 BPMN 規範中定義標準的圖形和符號。
四種基本要素
BPMN 2.0 的圖形結構和要素,建議直接參考 WIKI 百科的答案,這裡我就不搬運了:
2.0 的幾點改進
相比 BPMN 1.0 主要有以下改進:
- 規範了流程元素的執行語法。
- 定義了流程模型和流程圖的擴充套件機制。
- 細化了事件的組成。 擴充套件了參與者的互動定義。
- 定義了編排模型。
Activiti 介紹
Activiti 是目前國內比較主流的基於 BPMN 2.0 規範實現的工作流引擎,目前已經發布到 7.X 版本,並且已經開始實現 DMN 規範(決策與圖形,後面會講),另外關於工作流引擎還有一些比較老牌的玩家例如:JBPM
現在發展的也很不錯,還有目前比較新興的流程引擎:camunnda
,flowable
目前看起來也潛力十足,他們都是遵循了 BPMN 2.0 規範,因為在國內應用的比較主流,所以這裡我們這裡重點介紹 Activiti
Activiti 出現和發展
這裡簡單介紹 JBPM 和 Activiti 的發展歷史,有興趣深究的自行去 Google 搜尋
Activiti 的發展線路:
Tom Baeyens
是 JBPM 的創始人,因為理念不合 Tom Baeyens 加入Alfresco
公司後又釋出了Activit 5
- JBPM 因此放棄 JBPM 4 架構,完全基於 Drools Flow 重新開發
JBMP 5
,但他們同樣都支援 BPMN 2.0 規範 - 從正統的延續來看,
Activit 5
更像是對 JBPM 3、JBPM 4 的延續,所以國內大多企業都選擇Activit
JBPM、Activiti 區別
- JBPM 推翻歷史架構,重新使用了 Drools Flow 作為工作流架構
- JBPM 採用的是 LGPL 開源協議,對原始碼修改需要商業授權
- Activiti 採用了更為寬鬆的 Apache License 2.0 協議
- ……(想到再補充)
官方的 Activiti 示例
官方釋出的 Activiti
演示程式,可以首先通過該例子來了解 Activiti 大部分功能,包括:
- 流程定義
- 流程釋出
- 動態表單
等等,通過這個示例程式,作為切入 Activiti 的引子,建立初步瞭解後,更有信心深入瞭解 Activiti 工作流引擎
下載和使用示例程式步驟:
- Activiti 6.0 示例程式
- 將示例程式 /wars 目錄下的 3 個程式拷貝到 Tomcat/webapps 目錄,然後啟動 Tomcat 即可
- 訪問示例程式:http://localhost:8080/activiti-app/#/ 輸入預設賬號:admin/test 訪問即可
Activiti 目錄 /wars 下的三個示例程式職責分工:
應用 | 說明 | 地址 | 預設賬號 |
---|---|---|---|
activiti-app | 一個比較完善的流程引擎示例程式 | /activiti-app | admin/test |
activiti-admin | 用於檢視流程引擎中的主要資料 | /activiti-admin | admin/admin |
activiti-rest | rest-api 應用 API,不再侷限 Jar | /activiti-rest | kermit/kermit |
演示一個簡易的工作流的幾個步驟:
- 進入
activiti-app
系統,為建立使用者 - 設計一個簡單的工作流,並且為流程節點繫結使用者
- 建立 HR App 應用程式,設定包含請假流程,並且釋出
- 員工進入 HR App 程式,提交一個請假申請
- 經理進入系統,並且同意員工的請假申請,示例流程完成
- 通過 activiti-admin 程式連線到 activiti-app 檢視流程的歷史
進入 activiti-app
系統,為建立使用者
這裡簡單介紹三個選單的主要功能:
- Kickstart App:定義應用程式,設計流程,建立程式和流程之間的關係
- Task App:管理示例程式的任務,例如:我的待辦,發起流程等等
- Identity management:管理使用者、使用者組等資訊
在 Identity management -> Users 選單建立兩個使用者,用於模擬工作流:
在 Kickstart App -> Processes 建立簡單的請假流程
值得注意的是需要為使用者任務分配流程變數,我們這裡簡單起見直接繫結使用者,如圖:
最後我們在 Kickstart App -> Apps 建立一個應用程式,並且繫結剛才設計的請假流程,如圖:
切記要釋出流程,這樣我們切換普通員工 jack
身份進入系統的時候,就能看到釋出應用程式,並且可以發起請假申請了,如圖:
今天身體有點不舒服,進入 HR App 發起請假申請,如圖:
當我的請假申請提交的時候,任務就會自動發到經理那邊,我們切換經理賬號看看:
當經理點選完成後,流程走完,任務就自動結束了。
那麼如果想要檢視流程歷史,就要藉助 activiti-admin
這個演示程式了:
- 開啟連結:http://localhost:8080/activiti-admin/ 進入首頁
- 輸入預設賬號 admin/admin 就可以
- 首次進入要配置
activiti-app
的資訊
如圖:
這裡我們配置過就可以直接開啟 Instance
,就可以看到所有執行過的流程歷史,點選流程例項就可以看到詳細的歷史資訊,如圖:
總結
本篇主要介紹:
- 工作流概念和發展
- BPMN 和 Activiti 的誕生和發展
- Activiti 官方示例程式的展示
- Activiti 配置功能展示
以上功能只是流程引擎的九牛一毛,希望通過以上示例程式可以更好的幫助大家建立信心,從而更好面對後面的進階知識。更好的掌握 Activiti 和 BPMN 2.0 的世界。