詳解工作流框架Activiti的服務架構和元件

華為雲開發者社群發表於2021-12-03
摘要:通過這篇文章,可以對工作流有一個基本的認識,為後續工作流框架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開源工作流框架

Activiti簡介

  • Activiti是一個開源的工作流引擎,它實現了BPMN 2.0規範,可以釋出設計好的流程定義,並通過api進行流程排程
  • Activiti 作為一個遵從 Apache 許可的工作流和業務流程管理開源平臺,其核心是基於Java的超快速,超穩定的 BPMN2.0 流程引擎,強調流程服務的可嵌入性和可擴充套件性,同時更加強調面向業務人員
  • Activiti 流程引擎重點關注在系統開發的易用性和輕量性上.每一項BPM業務功能Activiti流程引擎都以服務的形式提供給開發人員.通過使用這些服務,開發人員能夠構建出功能豐富,輕便且高效的BPM應用程式

Activiti服務結構

  • 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的服務架構和元件

  • 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,在表結構設計方面也遵循執行時與歷史資料的分離
  • 這樣的設計可以快速讀取執行時資料,僅當需要查詢歷史資料時再從專門的歷史資料表中讀取.這種設計方式可以大幅提高資料的存取效率,尤其是當資料日積月累時依然能夠快速反應

 

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章