摘要:通過這篇文章,可以對工作流有一個基本的認識,為後續工作流框架Activiti的學習打下堅實的基礎。
本文分享自華為雲社群《BPMN工作流的基本概念!詳解工作流框架Activiti的服務架構和元件》,作者: 攻城獅Chova 。
工作流
工作流簡介
- 工作流(Workflow): 工作流就是通過計算機技術對業務流程進行自動化管理。實現多個參與者按照預定的流程去自動執行業務流程。
- 定義: 通過計算機對業務流程自動化執行管理
- 主要解決的是: 使在多個參與者之間按照某種預定義的規則自動進行傳遞文件,資訊或任務的過程.從而實現某個預期的業務目標,或者促使此目標的實現
- 工作流管理系統的目標:
- 管理工作的流程以確保工作在正確的時間被期望的人員所執行
- 在自動化進行的業務過程中插入人工的執行和干預
- 工作流框架:
- Activiti,JBPM,OSWorkFlow,WorkFlow
- 工作流框架底層需要有資料庫提供支援
工作流術語
工作流引擎
- ProcessEngine物件: 這是Activiti工作的核心.負責生成流程執行時的各種例項及資料,監控和管理流程的執行
BPM
- 業務流程管理:
- 是一種以規範化的構造端到端的卓越業務流程為中心,以持續的提高組織業務績效為目的的系統化方法
- 常見商業管理教育如EMBA,MBA等均將BPM包含在內
BPMN
- 業務流程建模與標註:
- 這些圖如何組合成一個業務流程圖(Business Process Diagram)
- 討論BPMN的各種的用途:包括以何種精度來影響一個流程圖中的模型
- BPMN作為一個標準的價值
- BPMN未來發展的遠景
流物件
一個業務流程圖有三個流物件的核心元素
- 事件
- 一個事件用圓圈來描述,表示一個業務流程期間發生的東西
- 事件影響流程的流動.一般有一個原因(觸發器)或一個影響(結果)
- 基於它們對流程的影響,有三種事件:開始事件,中間事件,終止事件
- 活動
- 用圓角矩形表示,一個流程由一個活動或多個活動組成
- 條件
- 條件用菱形表示,用於控制序列流的分支與合併。
- 可以作為選擇,包括路徑的分支與合併
- 內部的標記會給出控制流的型別
Activiti開源工作流框架
Activiti簡介
- Activiti是一個開源的工作流引擎,它實現了BPMN 2.0規範,可以釋出設計好的流程定義,並通過api進行流程排程
- Activiti 作為一個遵從 Apache 許可的工作流和業務流程管理開源平臺,其核心是基於Java的超快速,超穩定的 BPMN2.0 流程引擎,強調流程服務的可嵌入性和可擴充套件性,同時更加強調面向業務人員
- Activiti 流程引擎重點關注在系統開發的易用性和輕量性上.每一項BPM業務功能Activiti流程引擎都以服務的形式提供給開發人員.通過使用這些服務,開發人員能夠構建出功能豐富,輕便且高效的BPM應用程式
Activiti服務結構
- Activiti系統服務結構圖
- 核心類:
- ProcessEngine: 流程引擎的抽象,可以通過此類獲取需要的所有服務
- 服務類:
- XxxService: 通過ProcessEngine獲取,Activiti將不同生命週期的服務封裝在不同Service中,包括定義,部署,執行.通過服務類可獲取相關生命週期中的服務資訊
- RepositoryService
- Repository Service提供了對repository的存取服務
- Activiti中每一個不同版本的業務流程的定義都需要使用一些定義檔案,部署檔案和支援資料(例如BPMN2.0XML檔案,表單定義檔案,流程定義影像檔案等),這些檔案都儲存在Activiti內建的Repository中
- RuntimeService
- Runtime Service提供了啟動流程,查詢流程例項,設定獲取流程例項變數等功能.此外它還提供了對流程部署,流程定義和流程例項的存取服務
- TaskService
- Task Service提供了對使用者Task和Form相關的操作.它提供了執行時任務查詢,領取,完成,刪除以及變數設定等功能
- HistoryService
- History Service用於**獲取正在執行或已經完成的流程例項的資訊,**與Runtime Service中獲取的流程資訊不同,歷史資訊包含已經持久化儲存的永久資訊,並已經被針對查詢優化
- FormService
- 使用Form Service可以存取啟動和完成任務所需的表單資料並且根據需要來渲染表單
- Activiti中的流程和狀態Task均可以關聯業務相關的資料
- IdentityService
- Identity Service提供了對Activiti系統中的使用者和組的管理功能
- Activiti中內建了使用者以及組管理的功能,必須使用這些使用者和組的資訊才能獲取到相應的Task
- ManagementService
- Management Service提供了對Activiti流程引擎的管理和維護功能
- 這些功能不在工作流驅動的應用程式中使用,主要用於 Activiti 系統的日常維護
- 核心業務物件:
- org.activiti.engine.impl.persistence.entity包下的類,包括Task,ProcessInstance,Execution等
- 根據不同職責實現相應介面的方法(如需要持久化則繼承PersistentObject介面),與傳統的實體類不同
Activiti元件
- Activiti上下文元件Context: 用來儲存生命週期比較長,全域性性的資訊,類似Application.主要包括如下三類:
- CommandContext: 命令上下文-儲存每個命令必要的資源,如持久化需要的session
- ProcessEngineConfigurationImpl: 流程引擎相關配置資訊-整個引擎全域性的配置資訊.如資料來源DataSource等.該物件為單例,在流程引擎建立的時候初始化
- ExecutionContext: 持有ExecutionEntity物件
- 持久化元件:
- Activiti使用mybatis作OR對映,並在此基礎上增加設計了自己的持久化框架
- 在流程引擎建立時初始化,頂層介面Session,SessionFactory
- Session有兩個實現類:
- DbSqlSession: 負責sql表示式的執行
- AbstractManager: 負責物件的持久化操作
- SessionFactory有兩個實現類:
- DbSqlSessionFactory: 負責DbSqlSession相關操作
- GenericManagerFactory: 負責AbstractManager相關操作
- Event-Listener元件:
- Activiti允許客戶程式碼介入流程執行,提供了事件監聽元件
- 監聽的事件型別:
- TaskListener
- JavaDelegate
- Expression
- ExecutionListener
- ProcessEngineConfigurationImpl持有DelegateInterceptor的某個例項,方便呼叫handleInvocation
- Cache元件
- DbSqlSession中有cache的實現
- Activiti基於List和Map來做快取:如查詢時先查快取,沒有則直接查詢並放入快取
- 非同步執行元件
- Activiti可以執行任務,JobExecutor為其核心類,JobExecutor包含三個主要屬性:
- JobAcquisitionThread
- BlockingQueue
- ThreadPoolExecutor
- 方法ProcessEngines在引擎啟動時呼叫JobExecutor.start,JobAcquisitionThread 執行緒即開始工作,其run方法不斷迴圈執行AcquiredJobs中的job,執行一次後執行緒等待一定時間直到超時或者JobExecutor.jobWasAdded方法,因為有新任務而被呼叫。
流程虛擬機器PVM
- 流程虛擬機器API暴露了流程虛擬機器的POJO核心,流程虛擬機器API描述了一個工作流流程必備的元件,這些元件包括:
- PvmProcessDefinition: 流程的定義,形象點說就是使用者畫的那個圖.靜態含義
- PvmProcessInstance: 流程例項,使用者發起的某個PvmProcessDefinition的一個例項.動態含義
- PvmActivity: 流程中的一個節點
- PvmTransition: 銜接各個節點之間的路徑,形象點說就是圖中各個節點之間的連線線
- PvmEvent: 流程執行過程中觸發的事件
Activiti架構
- Activiti Engine:
- 最核心的模組
- 提供針對BPMN 2.0規範的解析,執行,建立,管理(任務,流程例項),查詢歷史記錄並根據結果生成報表
- Activiti Modeler:
- 模型設計器
- 適用於業務人員把需求轉換為規範流程定義
- Activiti Designer:
- 功能和Activiti Modeler類似,同樣提供了基於BPMN 2.0規範的視覺化設計功能,但是目前還沒有完全支援BPMN規範的定義
- 可以把業務需求人員用Signavio設計的流程定義(XML格式)匯入到Designer中,從而讓開發人員將其進一步加工成為可以執行的流程定義
- Activiti Explorer:
- 可以用來管理倉庫,使用者,組,啟動流程,任務辦理等
- 此元件使用REST風格API,提供一個基礎的設計模型.如果業務簡單,也可以直接使用無需開發.還可以作為後臺管理員的流程、任務管理系統使用
- Activiti REST:
- 提供RESTful風格的服務
- 允許客戶端以JSON的方式與引擎的REST API互動
- 通用的協議具有跨平臺,跨語言的特性
Activiti資料庫支援
- Activiti的後臺由有資料庫的支援
- 所有的表都以ACT_開頭
- 第二部分是表示表的用途的兩個字母標識
- 用途也和服務的API對應
ACT_RE_* : 'RE'表示repository. 這個字首的表包含了流程定義和流程靜態資源(圖片,規則...) ACT_RU_* : 'RU'表示runtime.這些執行時的表, 包含流程例項,任務,變數,非同步任務,等執行中的資料. Activiti只在流程例項執行過程中儲存這些資料,在流程結束時就會刪除這些記錄.這樣執行時表可以一直很小速度很快 ACT_ID_* : 'ID'表示identity.這些表包含身份資訊, 比如使用者,組... ACT_HI_* : 'HI'表示history.這些表包含歷史資料, 比如歷史流程例項,變數,任務... ACT_GE_* :通用資料. 用於不同場景下, 如存放資原始檔
- 資源庫流程規則表 (ACT_RE_*:'RE’表示repository. 這個字首的表包含了流程定義和流程靜態資源(圖片,規則…))
act_re_deployment 部署資訊表
act_re_model 流程設計模型部署表
act_re_procdef 流程定義資料表
- 執行時資料庫表 (ACT_RU_*:'RU’表示runtime.這些執行時的表, 包含流程例項,任務,變數,非同步任務,等執行中的資料.Activiti只在流程例項執行過程中儲存這些資料,在流程結束時就會刪除這些記錄.這樣執行時表可以一直很小速度很快)
act_ru_execution 執行時流程執行例項表
act_ru_identitylink 執行時流程人員表,主要儲存任務節點與參與者的相關資訊
act_ru_task 執行時任務節點表
act_ru_variable 執行時流程變數資料表
- 組織機構表 (ACT_ID_* : 'ID’表示identity.這些表包含身份資訊, 比如使用者,組…)
act_id_group 使用者組資訊表
act_id_info 使用者擴充套件資訊表
act_id_membership 使用者與使用者組對應資訊表
act_id_user 使用者資訊表
這四張表很常見,基本的組織機構管理,關於使用者認證方面建議還是自己開發一套,元件自帶的功能太簡單,使用中有很多需求難以滿足
- 歷史資料庫表 (ACT_HI_*:'HI’表示history.這些表包含歷史資料, 比如歷史流程例項,變數,任務…)
act_hi_actinst 歷史節點表
act_hi_attachment 歷史附件表
act_hi_comment 歷史意見表
act_hi_identitylink 歷史流程人員表
act_hi_detail 歷史詳情表,提供歷史變數的查詢
act_hi_procinst 歷史流程例項表
act_hi_taskinst 歷史任務例項表
act_hi_varinst 歷史變數表
- 組織機構表 (ACT_GE_*:通用資料. 用於不同場景下, 如存放資原始檔)
act_ge_bytearray 二進位制資料表
act_ge_property 屬性資料表儲存整個流程引擎級別的資料,初始化表結構時,會預設插入三條記錄
Activiti配置檔案
- activiti.cfg.xml: Activiti核心配置檔案,配置流程引擎建立工具的基本引數和資料庫連線池引數
- 定義資料庫配置引數
- 配置連線池引數
Activiti特點
資料持久化
- Activiti的設計思想是簡潔,快速
- 瓶頸體現在和資料庫交換資料的過程中,針對這一點Activiti選擇了使MyBatis,從而可以通過最優的SQL語句執行Command,僅憑如此就能讓引擎在速度上保持最高的效能
引擎service介面
- Activiti流程引擎重點關注在系統開發的易用性和輕量性上,每一項BPM業務功能Activiti流程引擎都以服務的形式提供給開發人員,通過使用這些服務,開發人員能夠構建出功能豐富,輕便且高效的BPM應用程式
- activiti.cfg.xml檔案為核心配置檔案,該配置檔案整合在Spring的IOC容器當中,可以產生ProcessEngineConfiguration物件,這個物件就是流程引擎的配置物件
- ProcessEngine物件為流程引擎物件,該物件是工作流業務系統的核心,所有的業務操作都是由這個物件所派生出來的物件實現
- Activiti引擎提供了七大Service介面,均通過ProcessEngine獲取,並且支援鏈式API程式設計風格
流程設計器
- 基於Web的Activiti Modeler流程設計器
- IDEA的actiBPM外掛
原生支援Spring
- Activiti原生支援Spring,可以很輕鬆地進行Spring整合,非常方便管理事務和解析表示式(Expression)
分離執行時與歷史資料
- Activiti繼承自jBPM4,在表結構設計方面也遵循執行時與歷史資料的分離
- 這樣的設計可以快速讀取執行時資料,僅當需要查詢歷史資料時再從專門的歷史資料表中讀取.這種設計方式可以大幅提高資料的存取效率,尤其是當資料日積月累時依然能夠快速反應