摘要:通過這篇文章,可以對工作流有一個基本的認識,為后續工作流框架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,在表結構設計方面也遵循運行時與歷史數據的分離
- 這樣的設計可以快速讀取運行時數據,僅當需要查詢歷史數據時再從專門的歷史數據表中讀取.這種設計方式可以大幅提高數據的存取效率,尤其是當數據日積月累時依然能夠快速反應