文章目錄
- 前言
- 1 流程引擎發展歷程
- 2 流程引擎主要概念
- BPM (Business Process Management)
- BPMN (Business Process Model and Notation)
- CMMN (Case Management Model and Notation)
- DMN (Decision Model and Notation)
- 事件(Event)
- 順序流(Sequence Flow)
- 網關(Gateway)
- 活動(Activity)
- 3 Activiti
- 3.1 概述
- 3.2 整體架構
- 3.3 數據庫表、版本不同會有差異
- 3.4 服務接口
- 3.5 流程設計器
- 3.6 Springboot 集成
- 4 Flowable
- 4.1 概述
- 4.2 Springboot集成
- 數據庫表、服務接口參考Activiti即可
- 5 Camunda
- 5.1 Camunda 架構圖
- 5.2 繪制流程圖
- 5.3 Springboot集成
- 數據庫表、服務接口參考Activiti即可
- 6 流程引擎功能對比
- 6.1 流程建模與執行
- 6.2 集成與擴展性
- 6.3 開源社區與支持
- 6.4 技術先進性與未來趨勢
- 總結
前言
工作流引擎技術是企業級應用中實現業務流程自動化的核心組件,它們允許開發者設計、執行和監控復雜的業務流程。在眾多的工作流引擎中,Activiti、Flowable和Camunda是三個備受關注的開源項目,它們各有特色,適用于不同場景下的需求。選擇合適的工作流引擎對于確保項目成功至關重要。以下是對這三種工作流引擎進行選型時的背景介紹編寫指導:
Activiti、Flowable、Camunda簡介
- Activiti:起源于 Alfresco,是一個輕量級、靈活且強大開源BPMS(業務流程管理系統),適合需要快速開發和部署的工作場景。
- Flowable:由 Activiti 的原班人馬創建,作為Activiti的一個分支,旨在解決后者的一些局限性,提供了更強大的微服務架構支持和更好的性能。
- Camunda:同樣源自開源社區,以其強大的 BPMN 2.0 支持、嵌入式能力以及豐富的監控和分析工具而聞名,適合構建復雜的企業級應用。
技術對比框架
- 核心功能對比:比較它們對BPMN 2.0的支持程度、表單處理能力、任務管理、事件監聽、異常處理等核心功能。
- 架構與擴展性:分析各自的架構設計(如是否支持微服務)、可擴展性、與現有系統集成的難易程度。
- 性能與穩定性:基于公開數據或實際使用經驗,討論它們的性能表現、資源消耗及穩定性。
- 社區與支持:評估各自的社區活躍度、文檔完整性、官方支持及第三方插件或服務的豐富度。
選型考慮因素
- 強調在選型時應考慮的關鍵因素,包括但不限于項目規模、預算、技術棧兼容性、未來可擴展性、團隊熟悉度等。
- 提醒讀者在決策前進行充分的調研和原型測試,以確保所選引擎能夠滿足項目特定需求。
定義與核心價值
工作流引擎是一種軟件系統,它設計用于自動化、管理和優化業務流程。它通過定義、執行和監控一系列相互關聯的任務或活動,這些任務按照預設的規則和條件流轉,以完成特定的業務目標。工作流引擎的核心價值在于提升業務效率,減少人為錯誤,確保流程的一致性和合規性,同時提供流程透明度和可追溯性。隨著數字化轉型的加速,工作流引擎已成為企業應用架構中的關鍵組件,支撐著從簡單審批流程到復雜跨部門協作的廣泛需求。
技術與標準
現代工作流引擎通常基于國際標準如BPMN(Business Process Model and Notation)2.0來設計流程模型,該標準提供了一套統一的圖形符號和語義,使得非技術人員也能理解和參與流程設計。此外,工作流引擎還支持其他技術標準如DMN(Decision Model and Notation)用于決策邏輯建模,以及CMMN(Case Management Model and Notation)用于適應性更強的案例管理。
市場趨勢與創新
近年來,工作流引擎技術發展迅速,呈現出以下幾個顯著趨勢:
- 云原生與微服務化:越來越多的工作流引擎支持容器化部署和微服務架構,便于在云環境中彈性伸縮,提高系統的可維護性和擴展性。
- 低代碼/無代碼平臺集成:為了加速應用開發和流程自動化,許多工作流引擎集成低代碼工具,使業務用戶能快速構建流程應用而無需編寫大量代碼。
- AI與自動化:結合機器學習和人工智能技術,工作流引擎能實現智能路由、預測分析和自動化決策,進一步提升流程智能化水平。
- DevOps友好:強調CI/CD(持續集成/持續部署)的集成,提供版本控制、自動化測試等功能,加速迭代速度和質量保證。
在探索Activiti、Flowable、Camunda這三大開源工作流引擎的選型過程中,我們正站在數字化轉型浪潮的前沿,面對的是如何在復雜多變的業務場景中,精準匹配技術解決方案,以驅動企業效能的全面提升。本指南旨在深入剖析每一款引擎的特性和優勢,從它們的歷史沿革到最新技術進展,從核心功能對比到實際應用案例,全方位呈現三者在架構靈活性、性能表現、易用性、社區生態等方面的差異。通過這一深入的比較分析,我們旨在為IT決策者、架構師和開發者提供一份詳實的參考,幫助他們在面對具體項目需求時,能夠清晰地識別出最契合的工作流引擎,從而加速項目落地,推動企業向數字化、智能化轉型的進程。
1 流程引擎發展歷程
市場上比較有名的開源流程引擎有 jBPM 、Activiti、Camunda、Flowable 和 Compileflow。其中 jBPM、Activiti、Flowable、camunda 四個框架同宗同源,祖先都是 jbpm4,開發者只要用過其中一個框架,基本上就會用其它三個。而 Compileflow 專注純內存執行,是一個無狀態的流程引擎,可以作為了解。
-
jBPM 項目于 2002 年 3 月由 Tom Baeyens 發起,2003 年12 月發布1.0 版本
-
jBPM 在 2004 年 10 月 18 日,發布了 2.0 版本,并在同一天加入了JBoss 組織,成為了 JBoss 企業中間件平臺的一個組成部分,它的名稱也改成 JBoss jBPM。隨著 jBPM 加入 JBoss 組織,以及 JBoss 被 RedHat公司收購,jBPM 也進入一個全新的發展時代,它獲得了大量的社區和商業支持,因此發展前景十分光明
-
jBPM3 2005發布,jBPM4 2009 發布
-
2010年 jBPM 創始人 Tom Baeyens 離開 JBoss,隨之2011年 jBPM5 發布,Kris Verlaenen 領導 jBPM 的發展
-
jBPM 創始人 Tom Baeyens 離開 JBoss,隨之加入 Alfresco 后很快推出了新的基于 jBPM4 的開源工作流系統 Activiti5
-
2013 年,Activiti 開發團隊從 Activiti5 分離出 camunda BPM
-
2016 年 10 月,Activiti 工作流引擎的核心開發者 Tijs Rademakers 離開 Alfresco 公司并在 Activiti 5.22 版本分支基礎上開啟了 Flowable 開源項目
流程引擎歷史大事圖如下:
流程引擎對比
針對于業界流程引擎對比(jBPM、Activiti、Camunda、Flowable )如下:
對比項 | jBPM | Activiti | Flowable | Camunda |
---|---|---|---|---|
所屬公司 | jBoss | Alfresco | Flowable(瑞士、德國、美國和新加坡辦事處) | Camunda(德國) |
技術前身 | 版本5之后 Drools Flow | jBPM4 | Activiti 5 & 6 | Activiti 5 |
方向 | 重量級 | 商業和云 | 工具型 | 輕量&工具型 |
流程設計器 | Business Central | Activiti 官方 demo activiti-app.war | Flowable UI | Camunda Modeler |
Spring集成 | 默認不支持 | 支持 | 支持 | 支持 |
ORM框架 | hibernate | myabits | myabits | myabits |
流程規范 | BPMN 2.0 | BPMN 2.0 | BPMN 2.0/CMMN/DMN | BPMN 2.0/CMMN/DMN |
活躍度 | 10~15次/年 commit 頻率 | commit 頻繁 | 2~3次 commit 頻率 | 15~20次/年 commit 頻率 |
2 流程引擎主要概念
BPM (Business Process Management)
BPM是一套全面的方法論,它涵蓋了業務流程的識別、設計、執行、監控和優化的整個生命周期。BPM不僅涉及到技術層面的流程自動化,還包括戰略規劃、變革管理、績效衡量等業務層面的內容。流程引擎通常是實現BPM的一個關鍵技術組件。
BPMN (Business Process Model and Notation)
BPMN是一種圖形化建模語言,用于描述業務流程的結構、行為和參與者之間的信息流。它提供了一系列標準化的符號和規則,使得業務分析師和IT專業人員能夠共同設計和理解業務流程。BPMN模型可以被流程引擎解析執行,實現業務流程的自動化。
BPMN是一個廣泛接受與支持的,展現流程的注記方法:OMG BPMN標準,BPMN2.0正式版本于2011年1月3日發布,常見的工作流引擎如:Activiti、Flowable、jBPM等都基于 BPMN 2.0 標準。
BPMN2.0基本形狀
- 流對象(Flow Objects),流對象是定義業務流程的主要圖形元素。它進一步細分為三個類別,分別是事件(Events)、活動(Activities)和網關(Gateways);
- 數據(Data),它分為四個類別:數據對象(Data Object)、數據輸入(Data Inputs)、數據輸出(Data Outputs)和數據存儲(Data Stores);
- 連接對象(Connection Ojbects),用來把各個流對象或流對象與其他信息連接起來,它分為四種類別:順序流(Sequence Flows)、消息流(Message Flows)、關聯(Associations)和數據關聯(Data Associations);
- 泳道(Swimlanes),用來區分不同部門或者不同參與者的功能和職責。Swimlanes包含兩種類別:池(Pool)和道(Lane);
- 人工交付物(Artifacts),它用以給流程附加一些額外的信息,它分為兩種類別:組(Group)和附注(Text Annotation)。
BPMN2.0 規范
- 是一套業務流程模型與符號建模標準
- 精準的執行語義來描述元素的操作
- 以 XML 為載體, 以符號可視化業務
XML Serializations for all presented Models
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="sid-38422fae-e03e-43a3-bef4-bd33b32041b2" targetNamespace="http://bpmn.io/bpmn" exporter="bpmn-js (https://demo.bpmn.io)" exporterVersion="15.1.3"><process id="Process_1" isExecutable="false"><startEvent id="StartEvent_1y45yut" name="hunger noticed"><outgoing>SequenceFlow_0h21x7r</outgoing></startEvent><task id="Task_1hcentk" name="choose recipe"><incoming>SequenceFlow_0h21x7r</incoming><outgoing>SequenceFlow_0wnb4ke</outgoing></task><sequenceFlow id="SequenceFlow_0h21x7r" sourceRef="StartEvent_1y45yut" targetRef="Task_1hcentk" /><exclusiveGateway id="ExclusiveGateway_15hu1pt" name="desired dish?"><incoming>SequenceFlow_0wnb4ke</incoming><incoming>Flow_0xtm5qb</incoming></exclusiveGateway><sequenceFlow id="SequenceFlow_0wnb4ke" sourceRef="Task_1hcentk" targetRef="ExclusiveGateway_15hu1pt" /><inclusiveGateway id="Gateway_09q2xe7"><outgoing>Flow_0xtm5qb</outgoing><outgoing>Flow_0xv9yxo</outgoing></inclusiveGateway><sequenceFlow id="Flow_0xtm5qb" sourceRef="Gateway_09q2xe7" targetRef="ExclusiveGateway_15hu1pt" /><sequenceFlow id="Flow_0xv9yxo" sourceRef="Gateway_09q2xe7" targetRef="Gateway_10k824i" /><task id="Activity_1yfhd3x"><incoming>Flow_1wboruz</incoming><outgoing>Flow_1flrhu1</outgoing></task><sequenceFlow id="Flow_1wboruz" sourceRef="Gateway_10k824i" targetRef="Activity_1yfhd3x" /><endEvent id="Event_1hdhify"><incoming>Flow_1flrhu1</incoming><incoming>Flow_0ekoeag</incoming></endEvent><sequenceFlow id="Flow_1flrhu1" sourceRef="Activity_1yfhd3x" targetRef="Event_1hdhify" /><task id="Activity_17jbx0j"><incoming>Flow_05xtbpr</incoming><outgoing>Flow_0ekoeag</outgoing></task><sequenceFlow id="Flow_05xtbpr" sourceRef="Gateway_10k824i" targetRef="Activity_17jbx0j" /><parallelGateway id="Gateway_10k824i"><incoming>Flow_0xv9yxo</incoming><outgoing>Flow_1wboruz</outgoing><outgoing>Flow_05xtbpr</outgoing></parallelGateway><sequenceFlow id="Flow_0ekoeag" sourceRef="Activity_17jbx0j" targetRef="Event_1hdhify" /></process><bpmndi:BPMNDiagram id="BpmnDiagram_1"><bpmndi:BPMNPlane id="BpmnPlane_1" bpmnElement="Process_1"><bpmndi:BPMNShape id="StartEvent_1y45yut_di" bpmnElement="StartEvent_1y45yut"><omgdc:Bounds x="152" y="102" width="36" height="36" /><bpmndi:BPMNLabel><omgdc:Bounds x="134" y="145" width="73" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape id="Task_1hcentk_di" bpmnElement="Task_1hcentk"><omgdc:Bounds x="240" y="80" width="100" height="80" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="ExclusiveGateway_15hu1pt_di" bpmnElement="ExclusiveGateway_15hu1pt" isMarkerVisible="true"><omgdc:Bounds x="395" y="95" width="50" height="50" /><bpmndi:BPMNLabel><omgdc:Bounds x="387" y="71" width="66" height="14" /></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape id="Gateway_19khf0h_di" bpmnElement="Gateway_09q2xe7"><omgdc:Bounds x="395" y="215" width="50" height="50" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_1yfhd3x_di" bpmnElement="Activity_1yfhd3x"><omgdc:Bounds x="690" y="200" width="100" height="80" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Event_1hdhify_di" bpmnElement="Event_1hdhify"><omgdc:Bounds x="1052" y="242" width="36" height="36" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Gateway_18yg547_di" bpmnElement="Gateway_10k824i"><omgdc:Bounds x="495" y="215" width="50" height="50" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Activity_17jbx0j_di" bpmnElement="Activity_17jbx0j"><omgdc:Bounds x="680" y="330" width="100" height="80" /></bpmndi:BPMNShape><bpmndi:BPMNEdge id="SequenceFlow_0h21x7r_di" bpmnElement="SequenceFlow_0h21x7r"><omgdi:waypoint x="188" y="120" /><omgdi:waypoint x="240" y="120" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="SequenceFlow_0wnb4ke_di" bpmnElement="SequenceFlow_0wnb4ke"><omgdi:waypoint x="340" y="120" /><omgdi:waypoint x="395" y="120" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0xtm5qb_di" bpmnElement="Flow_0xtm5qb"><omgdi:waypoint x="420" y="215" /><omgdi:waypoint x="420" y="145" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0xv9yxo_di" bpmnElement="Flow_0xv9yxo"><omgdi:waypoint x="445" y="240" /><omgdi:waypoint x="495" y="240" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_1wboruz_di" bpmnElement="Flow_1wboruz"><omgdi:waypoint x="545" y="240" /><omgdi:waypoint x="690" y="240" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_1flrhu1_di" bpmnElement="Flow_1flrhu1"><omgdi:waypoint x="790" y="240" /><omgdi:waypoint x="921" y="240" /><omgdi:waypoint x="921" y="260" /><omgdi:waypoint x="1052" y="260" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_05xtbpr_di" bpmnElement="Flow_05xtbpr"><omgdi:waypoint x="520" y="265" /><omgdi:waypoint x="520" y="370" /><omgdi:waypoint x="680" y="370" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0ekoeag_di" bpmnElement="Flow_0ekoeag"><omgdi:waypoint x="780" y="370" /><omgdi:waypoint x="916" y="370" /><omgdi:waypoint x="916" y="260" /><omgdi:waypoint x="1052" y="260" /></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>
CMMN (Case Management Model and Notation)
CMMN是一種用于建模適應性案例管理流程的標準,特別適用于那些需要根據具體情況動態調整流程步驟的情況。與BPMN相比,CMMN更加強調靈活性和案例(Case)的個性化處理,允許在執行過程中根據數據和事件動態添加或修改任務。CMMN模型描述的是案例的生命周期和管理規則。
DMN (Decision Model and Notation)
DMN是一種用于表達業務決策邏輯的標準,它獨立于業務流程模型,旨在將決策邏輯從流程中分離出來,以提高模型的清晰度和可維護性。DMN通過決策表、決策樹等圖形化方式定義決策邏輯,幫助分析人員和業務專家明確決策點的輸入、規則和輸出,使得決策過程更加透明和可管理。流程引擎可以調用DMN模型來自動做出決策。一般用于規則引擎。
BPMN、CMMN、DMN流程模型對比
標準 | 說明 | 優點 | 缺點 | 應用場景 |
---|---|---|---|---|
BPMN(業務流程建模) | BPMN 是一種廣泛使用的業務流程建模標準,以圖形方式描述業務過程中的活動、事件、網關等元素,有助于可視化和管理流程。 | 適用于建模和執行結構化的業務流程。易于理解和使用,支持可視化建模。提供了廣泛的工具和支持。 | 對于非結構化和動態的業務流程可能較為復雜。可能需要額外的培訓,以理解 BPMN 元素和規范 | 審批流程: 一個典型的用例是設計一個流程來處理文檔、合同或報銷單的審批。這包括定義不同角色的任務、決策網關來確定流程的走向等。采購流程: 通過BPMN,可以建模整個采購過程,從需求識別到供應商選擇、訂單生成、交貨和支付。 |
CMMN(案例管理建模) | CMMN 是用于建模和執行案例管理的標準,適用于處理不確定、動態的業務情境,允許靈活地適應業務變化。 | 適用于建模和執行靈活、非結構化的業務案例。支持動態適應業務變化。可以處理未知和復雜的業務情境。 | 相對于傳統的 BPMN,學習和理解曲線可能較陡峭。可能不適用于一些較為結構化的業務流程。 | 客戶服務管理: 為了管理客戶投訴,可以使用CMMN建模來處理不同類型的投訴案例。每個案例可能需要不同的步驟和解決方案。事件管理: 在緊急情況下,例如事故響應或災難恢復,CMMN可以幫助建模復雜的案例,其中步驟和任務可能不是線性的。 |
DMN(決策建模) | DMN 是用于建模和執行業務決策的標準,它提供了一種圖形方式定義決策表和業務規則,使決策可視化、易于管理和修改。 | 適用于建模和執行業務決策,使得決策可視化和易于管理。支持業務用戶定義和管理決策表。可以與其他標準(如BPMN)集成。 | 對于某些復雜的決策場景,可能需要深入的業務領域知識。不是所有業務場景都適用于決策表的建模。 | 信用評估: 金融機構可以使用DMN來建模信用評估決策,根據申請人的信用得分、收入等信息做出決策。產品定價: 針對不同市場條件和策略,企業可以使用DMN建模來制定產品的定價策略,考慮到各種因素。 |
事件(Event)
事件代表流程生命周期中發生的特定時刻或條件,它們用于觸發流程中的動作或改變流程的執行路徑。事件通常用圓形表示,并根據其功能分為三類:
- 開始事件:標記流程的起點,可以是普通開始事件、定時開始事件或信號開始事件等。
- 中間事件:發生在流程執行過程中,如消息事件、定時器事件、錯誤事件等,會影響流程的流轉。
- 結束事件:標志著流程或某個流程分支的完成。
- 邊界事件:附著在活動或網關上,當特定條件滿足時觸發,影響所附著元素的行為。
- 終止事件:特殊類型的結束事件,它不僅結束當前流程,還會取消任何未完成的并行分支或子流程。
順序流(Sequence Flow)
順序流是流程模型中連接不同元素(如活動、事件、網關)的有向連線,它定義了流程執行的邏輯順序。順序流用帶箭頭的直線表示,展示了流程從一個節點流向另一個節點的過程。每個順序流可以附加條件表達式,以決定何時啟用該流轉路徑。如果一個活動有多條外出順序流,流程引擎會根據條件判斷來選擇執行哪條路徑。
網關(Gateway)
網關用于控制流程的分支、合并或決策邏輯,是流程中的控制流機制。根據功能不同,網關可以分為:
- 排他網關(Exclusive Gateway):基于條件判斷,只有一個分支的條件為真時被執行。
- 并行網關(Parallel Gateway):用于流程的并行分支和匯聚,分支時復制執行路徑,匯聚時等待所有分支完成。
- 包容網關(Inclusive Gateway):可以有零個或多個分支被同時執行,取決于條件。
活動(Activity)
活動代表流程中的具體工作單元,是流程執行過程中的任務或操作。它可以是人工任務(如用戶審批、填寫表單)或系統任務(如自動郵件發送、數據處理)。活動用矩形表示,是流程引擎執行的主要內容,涉及到實際的業務操作。活動可以配置表單、分配規則、執行監聽器等,以滿足具體的業務需求。
這些基本元素共同構成了流程模型的骨架,通過它們的組合與配置,可以設計出復雜多變的業務流程模型,實現自動化和高效管理。
3 Activiti
3.1 概述
Activiti5是由Alfresco軟件在2010年5月17日發布的業務流程管理(BPM)框架,它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。Activiti基于Apache許可的開源BPM平臺,創始人Tom Baeyens是JBoss jBPM的項目架構師,它特色是提供了eclipse插件,開發人員可以通過插件直接繪畫出業務流程圖。
Activiti 是一個針對企業用戶、開發人員 、系統管理員的輕量級工作流業務管理平臺,其核心是使用 java 開發的快速 、 穩定的 BPMN2.0 流程引擎 。它可以與 spring 完美集成。
創始人 Tom Baeyens 曾經是 JBoss jBPM 的項目架構師,所以之前接觸過 jBPM4 的同學,會覺得 Activiti5 很親切。
3.2 整體架構
Activiti工作流引擎架構大致分為6層,如圖所示。從上到下依次為工作流引擎層、部署層、業務接口層、命令攔截層、命令層和行為層。
-
工作流引擎層:主要指ProcessEngine接口,這是Activiti所有接口的總入口。
-
部署層:包括DeploymentBuilder和BpmnModel等與流程部署相關的類。理論上,部署層并不屬于Activiti引擎架構的分層體系。將其單獨拿出來作為一層,只是為了突出其重要性。流程運轉基于流程定義,而流程定義解析就是流程的開始。從流程模型轉換為流程定義、將其解析為簡單Java對象(Plain Ordinary Java Object, POJO),都是基于部署層實現的。
-
業務接口層:面向業務提供各種服務接口,如RuntimeService、TaskService等。
-
命令攔截層:采用責任鏈模式,通過攔截器層為命令的執行創造條件,如開啟事務、創建CommandContext上下文、記錄日志等。
-
命令層:Activiti的業務處理層。Activiti的整體編碼模式采用的是命令模式,將業務邏輯封裝為一個個Command接口實現類。這樣,新增一個業務功能時只需新增一個Command實現。
-
行為層:包括各種FlowNodeActivityBehavior和ActivitiEventListener,這些類負責執行和監聽Activiti流程具體的流轉動作。
3.3 數據庫表、版本不同會有差異
Activiti的表都以ACT_開頭。 第二部分是表示表的用途的兩個字母標識。 用途也和服務的API對應。
ACT_RE_: 'RE’表示repository
。 這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。
ACT_RU_: 'RU’表示runtime
。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。
ACT_ID_: 'ID’表示identity
。 這些表包含身份信息,比如用戶,組等等。
ACT_HI_: 'HI’表示history
。 這些表包含歷史數據, 比如歷史流程實例, 變量,任務等等。
ACT_GE_*: 通用
數據, 用于不同場景下。
其他:ACT_EVT_LOG和ACT_PROCDEF_INFO沒有按照規則來,兩者分別屬于HI和RE。
activiti5.21
中,activiti數據中含有25張表,其中按照命名規則命名的表有23張,如下圖:
此外還有兩張表:ACT_EVT_LOG和ACT_PROCDEF_INFO沒有按照規則來,兩者分別屬于HI和RE。
3.4 服務接口
Activiti 提供了 7 個服務接口,都通過 ProcessEngine 來獲取,并且支持鏈式編程風格:
服務接口 | 說明 |
---|---|
RepositoryService | 倉庫服務,用于管理倉庫,比如部署或刪除流程定義、讀取流程資源等。 |
IdentifyService | 身份服務,管理用戶、組以及它們之間的關系。 |
RuntimeService | 運行時服務,管理所有正在運行的流程實例、任務等對象。 |
TaskService | 任務服務,管理任務。 |
FormService | 表單服務,管理和流程、任務相關的表單。 |
HistroyService | 歷史服務,管理歷史數據。 |
ManagementService | 引擎管理服務,比如管理引擎的配置、數據庫和作業等核心對象。 |
3.5 流程設計器
與 jBPM 類似,Activiti 也提供了基于 Eclipse 的流程設計器 —— Eclipse Designer。 此外還有 Signavio 公司為 Activiti 定制的基于 Web 的 流程設計器 —— Activiti Modeler。
3.6 Springboot 集成
Activiti 與 Spring Boot 集成比較簡單,只需要要引入以下依賴即可
<dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter-basic</artifactId><version>${activiti.version}</version>
</dependency>
這里不在具體實現,詳細參考 Activiti 官方文檔與 Spring 集成章節:https://www.activiti.org/userguide/#springintegration
4 Flowable
Activiti、Flowable 數據庫表、服務接口、流程設計器基本相同,這里不在贅述,需要的同學到官方查看。
4.1 概述
Flowable 是一個流行的輕量級的采用 Java 開發的業務流程引擎,通過 Flowable 流程引擎,我們可以部署遵循 BPMN2.0 協議的流程定義(一般為XML文件)文件,并能創建流程實例,查詢和訪問流程相關的實例與數據等等。
2016 年 10 月,Activiti 工作流引擎的核心開發者 Tijs Rademakers 離開 Alfresco 公司并在 Activiti 5.22 版本分支基礎上開啟了 Flowable 開源項目。Flowable 項目中包括 BPMN(Business Process Model and Notation)引擎、CMMN(Case Management Model and Notation)引擎、DMN(Decision Model and Notation)引擎、表單引擎(Form Engine)等模塊。
附 Flowable 官方地址:
Flowable 官方網站:https://www.flowable.com/
Flowable github:https://github.com/flowable
Flowable 版本發布記錄:https://github.com/flowable/flowable-engine/releases?page=1
Flowable 文檔:https://www.flowable.com/open-source/docs/
中文 Flowable 文檔
: https://tkjohn.github.io/flowable-userguide/#chapterApi
Flowable 教程:https://documentation.flowable.com/latest/howto/tutorial/first-experience
Flowable 整體架構
使用引擎 API 是與 Flowable 交互的最常見方式,核心類是 ProcessEngine,從 ProcessEngine 中可以獲取包含工作流/BPM方法的各種服務(與 Activiti5 類似,有興趣可進一步深入)。如下圖所示:
4.2 Springboot集成
Flowable官方Java示例:https://www.flowable.com/open-source/docs/bpmn/ch02-GettingStarted
引入依賴包,這里不做演示,具體參考官方示例:
<dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.8.0</version>
</dependency>
數據庫表、服務接口參考Activiti即可
5 Camunda
Camunda 是支持 BPMN(工作流和流程自動化)、CMMN(案例管理) 和 DMN(業務決策管理) java 框架。Camunda 基于Activiti5 保留了 PVM,其開發團隊也是從 activiti 中分裂出來的。Camunda 來自拉丁語動詞”capere”(理解)和“munda”(干凈),它意味著我們想要深入了解我們周圍的世界,并基于這種了解,我們想要以一種既有效又道德正確的方式讓世界成為一個更美好的地方,為了我們所有人。
附 Camunda 官方地址:
Camunda 官方首頁:https://camunda.com/
Camunda 官方文檔:https://docs.camunda.org/get-started/quick-start/
Camunda 中文翻譯文檔:http://camunda-cn.shaochenfeng.com/
Camunda github:https://github.com/camunda/
Camunda 使用
Camunda 官方提供了 Camunda Platform、Camunda Modeler,其中 Camunda Platform 以 Camunda engine 為基礎為用戶提供可視化界面,Camunda Modeler 是流程文件建模平臺,在 Camunda Modeler 創建的流程文件可以 deploy 到 Camunda Platform 并進行管理。另外三方服務可通過 Camunda 官方提供的 rest 或者 java api 來訪問 Camunda engine,操作的結果也可以在 Camunda Platform 查看和管理。
5.1 Camunda 架構圖
Camunda的核心包括了工作流引擎和建模軟件,整個流程可以參加下圖:
分別介紹下核心組件的作用:
Modeler
- 獨立安裝的建模器(windows、linux、mac),支持BPMN 2.0、CMMN 1.1、DMN 1.3建模,具體實現集成開源框架https://bpmn.io/
Process Engine
- 流程引擎,集成到應用中的Java包,用于執行BPMN、CMMN、DMN
Web Applicatons
- web管理平臺(支持獨立啟動(linux、windows)和集成到SpringBoot啟動,支持集群部署(SharedDB、需自定義LB及SessionState))
REST API
- 提供process engine相關處理接口
Cockpit
- 管理流程process及流程實例process instances
Tasklist
- 管理流程process中的具體任務task(導航到具體task、提供表單form輸入、修復流程實例等)
Admin
- 管理用戶users、組織group、授權authorizations
5.2 繪制流程圖
首先需要一個工具 Camunda Modeler 來畫,下載地址:https://camunda.com/download/modeler/
具體使用自行查閱官方資料
5.3 Springboot集成
需要3個maven依賴,分別是對應 流程引擎、Web管理平臺、提供rest api操作接口包
pom.xml
<dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter</artifactId><version>7.18.0</version>
</dependency>
<dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter-rest</artifactId><version>7.18.0</version>
</dependency>
<dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId><version>7.18.0</version>
</dependency>
yml配置文件
application.yml
## camunda登錄信息配置
camunda.bpm:admin-user:id: admin ##用戶名password: 123456 ##密碼firstName: yufilter:create: All tasks## mysql連接信息
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:8101/camundausername: xxxxpassword: xxxxtype: com.alibaba.druid.pool.DruidDataSource
數據庫
使用的是mysql,建新庫 camunda(數據庫必須是存在的,不然啟動不起來),啟動后會自動生成所需表結構
啟動后自動生成的表結構如下,基本和Activiti相同
登錄界面
登錄地址為 http://localhost:8080/
,輸入用戶名密碼即為配置文件里面的 admin,123456
java代碼簡單使用案例
conttoller
package cn.controller;import cn.service.TestTaskService;
import org.camunda.bpm.engine.repository.ProcessDefinition;
import org.camunda.bpm.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class TaskController {@Autowiredprivate TestTaskService testTaskService;//開啟流程@PostMapping("/start/process")public void startProcess(){testTaskService.startProcess();}//查詢流程定義@PostMapping("/find/process")public List<ProcessDefinition> findProcess(){return testTaskService.findProcesses();}//查詢任務@PostMapping("/task")public List<Task> findTasks(){return testTaskService.findTasks();}
}
service
package cn.service;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.repository.ProcessDefinition;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.camunda.bpm.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class TestTaskService {@Autowiredprivate TaskService taskService;@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate RepositoryService repositoryService;public void startProcess() {ProcessInstance instance = runtimeService.startProcessInstanceByKey("my_key");System.out.println("CaseInstanceId = "+instance.getCaseInstanceId());System.out.println("BusinessKey = "+instance.getBusinessKey());System.out.println("ProcessDefinitionId = "+instance.getProcessDefinitionId());System.out.println("ProcessInstanceId = "+instance.getProcessInstanceId());System.out.println("RootProcessInstanceId = "+instance.getRootProcessInstanceId());System.out.println("Id = "+instance.getId());System.out.println("TenantId = "+instance.getTenantId());}public List<ProcessDefinition> findProcesses() {return repositoryService.createProcessDefinitionQuery().list();}public List<Task> findTasks() {return taskService.createTaskQuery().list();}
}
數據庫表、服務接口參考Activiti即可
6 流程引擎功能對比
以下對比圖來自于網絡,僅供參考:
框架 | Flowable | JBPM | Activiti | Camunda |
---|---|---|---|---|
來源 | 國外 | 國外 | 國外 | 國外 |
是否收費 | 社區版開源 | 開源 | 開源 | 社區版開源 |
社區活躍度 | 較活躍 | 較活躍 | 活躍 | 不活躍 |
建模工具內容 | BPMN2/CMMN/DMN | BPMN2 | BPMN2 | BPMN2/CMMN/DMN |
持久層引擎 | JPA | JPA | MyBatis | MyBatis |
擴展節點(Mule\Http等) | √ | × | × | √ |
SpringBoot | √ | √ | √ | √ |
SpringCloud | × | × | √ | × |
Rest接口 | √ | √ | √ | √ |
功能 | 多 | 少 | 少 | 多 |
級別 | 重量級 | 輕量級 | 輕量級 | 輕量級 |
生成表數 | 47張 | 18張 | 25張 | 19張 |
性能 | 優 | 中 | 中 | 優 |
穩定性 | 優 | 中 | 中 | 優 |
外部任務 | 支持的不好 | 不支持 | 不支持 | 支持 |
缺點 | 開源版維護不及時、部分功能閉源、僅支持從開始節點運轉實例 | 接口不友好,整個架構體系很亂 | 維護不及時、功能缺少 | 對SpringCloud支持不好,需要自己實現分布式,文檔少遇到問題可能需要直接找作者 |
優點 | 功能完善,性能穩定性都好 | 無 | 社區用戶多,遇到問題容易找到解決方案,支持SpringCloud | 功能完善,架構輕量,性能穩定性都好 |
讓我們綜合比較Activiti、Camunda和Flowable這三個流行的工作流引擎,涵蓋關鍵特性、應用場景、以及技術優勢和局限性:
6.1 流程建模與執行
- Activiti提供了直觀的BPMN 2.0編輯器,支持復雜的流程設計。它的執行引擎高效且輕量,適合快速開發和部署流程應用,但近年來更新較少,可能在最新技術集成方面略顯滯后。
- Camunda以其強大的BPMN和DMN(決策模型和表示法)支持著稱,不僅提供圖形化建模工具,還支持CMMN(案例管理模型和表示法),適用于構建高度復雜的業務流程和決策管理系統。Camunda平臺還集成了高級分析和監控功能,適合大型企業級應用。
- Flowable是從Activiti分支出來的項目,繼承了Activiti的優點,并持續進行更新,增加了對微服務架構的更好支持,以及更多的可插拔組件和擴展點。Flowable在保持輕量的同時,提供了比Activiti更為豐富的功能和更好的社區支持。
6.2 集成與擴展性
- Activiti易于與Spring框架集成,適合Java開發環境,但由于社區活躍度下降,新集成框架和技術的支持可能不夠及時。
- Camunda提供了廣泛的集成選項,包括REST API、Spring集成、以及與各種應用服務器和數據庫的良好兼容性,適合集成到多樣化的企業IT架構中。其平臺化的設計使其在高可用性和可擴展性方面表現出色。
- Flowable同樣具備良好的集成能力,特別強調微服務架構下的靈活性,提供了更多針對云原生應用的優化和支持,比如Docker和Kubernetes的原生集成。
6.3 開源社區與支持
- Activiti的社區活躍度相對較低,盡管代碼庫成熟,但在新特性開發和問題響應速度上可能有所不足。
- Camunda擁有活躍的開源社區和專業的商業支持選項,適合那些需要長期穩定支持和專業服務的企業。
- Flowable社區活躍,更新頻繁,提供了與Activiti類似的開源體驗,同時由于其持續的開發和更新,對新技術的采納更為迅速。
6.4 技術先進性與未來趨勢
- Activiti雖為老牌工作流引擎,但近年來的發展相對緩慢,可能影響其在未來技術棧中的適用性。
- Camunda不斷推進技術創新,如對云原生的支持、低代碼/無代碼平臺集成等,顯示出強大的前瞻性和適應市場變化的能力。
- Flowable作為后起之秀,緊跟技術潮流,特別是在微服務、容器化、以及云原生應用的支持上,展現出良好的發展潛力和適應性。
總結
雖然Activiti、Flowable和Camunda各有千秋,但沒有絕對的好壞之分,關鍵在于根據項目的具體需求和環境選擇最適合的技術方案。Camunda注重流程的靈活性和可擴展性,提供了豐富的API和插件機制;Flowable注重流程的易用性和性能優化;而Activiti則以其起源早、社區活躍和廣泛的應用而知名。在選擇時,可以根據項目的具體需求、團隊的技術能力和偏好以及商業支持和服務等因素進行綜合考慮。