三大工作流引擎技術Activiti、Flowable、Camunda選型指南

文章目錄

  • 前言
  • 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 )如下:

對比項jBPMActivitiFlowableCamunda
所屬公司jBossAlfrescoFlowable(瑞士、德國、美國和新加坡辦事處)Camunda(德國)
技術前身版本5之后 Drools FlowjBPM4Activiti 5 & 6Activiti 5
方向重量級商業和云工具型輕量&工具型
流程設計器Business CentralActiviti 官方 demo activiti-app.warFlowable UICamunda Modeler
Spring集成默認不支持支持支持支持
ORM框架hibernatemyabitsmyabitsmyabits
流程規范BPMN 2.0BPMN 2.0BPMN 2.0/CMMN/DMNBPMN 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基本形狀
在這里插入圖片描述

  1. 流對象(Flow Objects),流對象是定義業務流程的主要圖形元素。它進一步細分為三個類別,分別是事件(Events)、活動(Activities)和網關(Gateways);
  2. 數據(Data),它分為四個類別:數據對象(Data Object)、數據輸入(Data Inputs)、數據輸出(Data Outputs)和數據存儲(Data Stores);
  3. 連接對象(Connection Ojbects),用來把各個流對象或流對象與其他信息連接起來,它分為四種類別:順序流(Sequence Flows)、消息流(Message Flows)、關聯(Associations)和數據關聯(Data Associations);
  4. 泳道(Swimlanes),用來區分不同部門或者不同參與者的功能和職責。Swimlanes包含兩種類別:池(Pool)和道(Lane);
  5. 人工交付物(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 流程引擎功能對比

以下對比圖來自于網絡,僅供參考:

框架FlowableJBPMActivitiCamunda
來源國外國外國外國外
是否收費社區版開源開源開源社區版開源
社區活躍度較活躍較活躍活躍不活躍
建模工具內容BPMN2/CMMN/DMNBPMN2BPMN2BPMN2/CMMN/DMN
持久層引擎JPAJPAMyBatisMyBatis
擴展節點(Mule\Http等)××
SpringBoot
SpringCloud×××
Rest接口
功能
級別重量級輕量級輕量級輕量級
生成表數47張18張25張19張
性能
穩定性
外部任務支持的不好不支持不支持支持
缺點開源版維護不及時、部分功能閉源、僅支持從開始節點運轉實例接口不友好,整個架構體系很亂維護不及時、功能缺少對SpringCloud支持不好,需要自己實現分布式,文檔少遇到問題可能需要直接找作者
優點功能完善,性能穩定性都好社區用戶多,遇到問題容易找到解決方案,支持SpringCloud功能完善,架構輕量,性能穩定性都好

讓我們綜合比較ActivitiCamundaFlowable這三個流行的工作流引擎,涵蓋關鍵特性、應用場景、以及技術優勢和局限性:

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則以其起源早、社區活躍和廣泛的應用而知名。在選擇時,可以根據項目的具體需求、團隊的技術能力和偏好以及商業支持和服務等因素進行綜合考慮。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36562.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從靜電到浪涌,全面防護:雷卯多電壓等級電源保護設計方案匯總

在當今數字化、電氣化日益加速的時代&#xff0c;電子設備和電力系統面臨著前所未有的挑戰&#xff0c;其中靜電放電(ESD)、浪涌以及雷擊等瞬態事件成為了威脅設備穩定性和壽命的關鍵因素。從精密的消費電子產品到工業級控制系統&#xff0c;從智能家居到新能源汽車&#xff0c…

區塊鏈技術的核心要素:共識機制、加密技術與分布式賬本

區塊鏈聽起來像個非常高大上的技術&#xff0c;其實它的核心原理并不難理解。今天我們要聊的就是區塊鏈的三個核心要素&#xff1a;共識機制、加密技術和分布式賬本。想象一下區塊鏈是一個巨大的數字筆記本&#xff0c;我們要弄清楚大家如何共同寫這個筆記本&#xff0c;又如何…

用一個實例看如何分享大量照片 續篇二,關于Exif (Exchangeable Image File) - 可交換圖像文件

續篇二&#xff1a;說說關于照片隱含的 Exif (Exchangeable Image File) 可交換圖像文件 數碼照片的Exif 參數有很多&#xff0c;重要的Exif信息&#xff1a;拍攝日期、時間、拍攝器材、GPS信息。 當然這主要對自己的檔案有意義&#xff0c;如果放到網上還是建議抹去這些信息。…

Bad owner or permissions on C:\\Users\\username/.ssh/config > 過程試圖寫入的管道不存在。

使用windows連接遠程服務器出現Bad owner or permissions 錯誤 問題&#xff1a; 需要修復文件權限 SSH 配置文件應具有受限權限以防止未經授權的訪問 確保只有用戶對該.ssh/config文件具有讀取權限 解決方案&#xff1a; 在windows下打開命令行&#xff0c;通過以下命令打開文…

C++編程(四)this指針 常函數 常對象 靜態成員

文章目錄 一、this指針&#xff08;一&#xff09;概念&#xff08;二&#xff09;顯式使用this指針的場景1. 當形參和成員變量名一致時2. 返回對象自身的時候必須要使用this指針3. 在類中銷毀一個對象 二、常函數和常對象&#xff08;一&#xff09;常函數1. 概念2. 語法格式 …

python OpenCV 庫中的 cv2.Canny() 函數來對圖像進行邊緣檢測,并顯示檢測到的邊緣特征

import cv2# 加載圖像 image cv2.imread(4.png)# 使用 Canny 邊緣檢測算法提取邊緣特征 edges cv2.Canny(image, 100, 200)# 顯示邊緣特征 cv2.imshow(Edges, edges) cv2.waitKey(0) cv2.destroyAllWindows() 代碼解析&#xff1a; 導入 OpenCV 庫&#xff1a; import cv2加…

【MFC】socket通信代碼解析

目錄 一、在MFC中使用Winsock進行socket編程 1.1 包含必要的頭文件 1.2 初始化Winsock 1.3創建socket 1.4 綁定socket 1.5 監聽連接(對于服務器) 1.6 建立連接(對于客戶端) 1.7 發送和接收數據 1.8. 關閉socket 1.9 錯誤處理 1.10 MFC集成 二、MFC中Socke…

PT100(RTD)是什么?2線,3線,4線原理

RTDs - or Resistance Temperature Detectors- (電阻式溫度探測器)&#xff0c;是溫度型傳感器&#xff0c;包含一個電阻&#xff0c;這個阻值可以隨溫度的變化而變化。在工業的進程中和實驗室里已經使用了很多年&#xff0c;以精確&#xff0c;可靠和穩定的特性。 2線制 2線制…

解決Ucharts在小程序上的層級過高問題

<qiun-wx-ucharts canvas2d"{{true}}" type"pie" opts"{{rectificationRateOpts}}" chartData"{{rectificationRateData}}" /> 開啟2d渲染即可解決&#xff08;在小程序開發工具上看著層級還是高&#xff0c;但是在手機上是正常…

C語言| 數組元素的刪除

同數組元素的插入差不多。 數組元素的插入&#xff0c;是先移動要插入元素位置后面的所有元素&#xff0c;再插入新元素&#xff0c;長度1。 C語言| 數組的插入-CSDN博客 數組元素的刪除&#xff0c;是先刪除元素&#xff0c;再把后面的元素往前移動一位&#xff0c;而本程序…

深入理解Spring中的核心注解:@Controller、@Component、@Service、@Repository、@Configuration及其擴展

在現代Java開發中&#xff0c;Spring框架以其強大的依賴注入&#xff08;DI&#xff09;和面向切面編程&#xff08;AOP&#xff09;功能深受開發者喜愛。Spring提供了一系列注解來簡化配置和管理Bean。本文將詳細探討Spring中的核心注解&#xff0c;包括Controller、Component…

【智能算法應用】麻雀搜索算法在物流配送中心選址的應用(無待選配送中心)

目錄 1.算法原理2.數學模型3.結果展示4.參考文獻5.代碼獲取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及實現 2.數學模型 模型假設 待定物流配送中心的庫存總能滿足需求點的需求不考慮從工廠到待定物流配送中心的運輸成本不考慮選定區域內待確定…

Vue 解決報錯 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise‘

Vue 報錯 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise’ 排查 控制臺報了一個錯誤 , Uncaught SyntaxError: Unexpected identifier ‘Promise’&#xff0c;網上查到的方法是 缺少符號&#xff0c;語法寫法錯誤&#xff0c;但這些都沒有解決我的問題&am…

RTDETR更換優化器——Lion

RTDETR更換Lion優化器 論文&#xff1a;https://arxiv.org/abs/2302.06675 代碼&#xff1a;https://github.com/google/automl/blob/master/lion/lion_pytorch.py 簡介&#xff1a; Lion優化器是一種基于梯度的優化算法&#xff0c;旨在提高梯度下降法在深度學習中的優化效果…

MyBatis~配置解析, 屬性(properties)、設置(settings)

注意, 對應的名稱一定要相同, 比如username就要對應username, 而且如果同時使用外部配置文件和property, 優先級是外部配置文件優先級更高 設置&#xff08;settings&#xff09; 這是 MyBatis 中極為重要的調整設置&#xff0c;它們會改變 MyBatis 的運行時行為。 下表描述了…

prompt:我是晚餐盲盒,只要你問出“今晚吃什么”我就將為你生成美妙的食物推薦。

使用方法&#xff1a;在ChatGP粘貼下面提示詞模型&#xff0c;點擊輸出。然后再問“晚餐有什么好吃的&#xff1f;”&#xff0c;AI輸出豐種食物供你選擇。抽到什么吃什么&#xff0c;極大的解決選擇困難的問題。 客戶需要生成1000條俏皮靈動&#xff0c;趣味盎然&#xff0c;比…

基于機器學習的網頁摘要生成算法的研究與實現

摘要&#xff1a;隨著互聯網的迅猛發展&#xff0c;網頁信息量呈爆炸式增長&#xff0c;用戶往往難以在海量信息中快速獲取所需內容。因此&#xff0c;開發一種能夠自動生成網頁摘要的算法&#xff0c;對于提高信息檢索效率具有重要意義。本文將對基于機器學習的網頁摘要生成算…

pytest測試框架pytest-order插件自定義用例執行順序

pytest提供了豐富的插件來擴展其功能&#xff0c;本章介紹插件pytest-order&#xff0c;用于自定義pytest測試用例的執行順序。pytest-order是插件pytest-ordering的一個分支&#xff0c;但是pytest-ordering已經不再維護了&#xff0c;建議大家直接使用pytest-order。 官方文…

華為云安全防護,九河云綜合分解優劣勢分析

隨著全球化的發展&#xff0c;越來越多的企業開始尋求在國際市場上擴展業務&#xff0c;這一趨勢被稱為企業出海。然而&#xff0c;企業在海外擴張面臨諸多隱患與安全挑戰&#xff0c;其中因為地域的不同&#xff0c;在安全性方面與國內相比會變得薄弱&#xff0c;從而導致被黑…

如何在瀏覽器中查看網頁的HTML源代碼?

如何在瀏覽器中查看網頁的HTML源代碼&#xff1f; 瀏覽html網頁&#xff0c;查看其源代碼&#xff0c;可以幫助我們了解該版網頁的信息以及架構&#xff0c;每個瀏覽器都是允許用戶查看他們訪問的任何網頁的HTML源代碼的。以下編程獅小師妹就介紹幾個常見瀏覽器的查看網頁 HTM…