Activiti工作流

工作流

工作流簡介

  • 工作流(Workflow): 工作流就是通過計算機(jī)技術(shù)對業(yè)務(wù)流程進(jìn)行自動化管理。實現(xiàn)多個參與者按照預(yù)定的流程去自動執(zhí)行業(yè)務(wù)流程。
    • 定義: 通過計算機(jī)對業(yè)務(wù)流程自動化執(zhí)行管理
    • 主要解決的是: 使在多個參與者之間按照某種預(yù)定義的規(guī)則自動進(jìn)行傳遞文檔,信息或任務(wù)的過程.從而實現(xiàn)某個預(yù)期的業(yè)務(wù)目標(biāo),或者促使此目標(biāo)的實現(xiàn)
  • 工作流管理系統(tǒng)的目標(biāo):
    • 管理工作的流程以確保工作在正確的時間被期望的人員所執(zhí)行
    • 在自動化進(jìn)行的業(yè)務(wù)過程中插入人工的執(zhí)行和干預(yù)
  • 工作流框架:
    • Activiti,JBPM,OSWorkFlow,WorkFlow
    • 工作流框架底層需要有數(shù)據(jù)庫提供支持

工作流術(shù)語

工作流引擎
  • ProcessEngine對象: 這是Activiti工作的核心.負(fù)責(zé)生成流程運(yùn)行時的各種實例及數(shù)據(jù),監(jiān)控和管理流程的運(yùn)行
BPM
  • 業(yè)務(wù)流程管理:
    • 是一種以規(guī)范化的構(gòu)造端到端的卓越業(yè)務(wù)流程為中心,以持續(xù)的提高組織業(yè)務(wù)績效為目的的系統(tǒng)化方法
    • 常見商業(yè)管理教育如EMBA,MBA等均將BPM包含在內(nèi)
BPMN
  • 業(yè)務(wù)流程建模與標(biāo)注:
    • 這些圖如何組合成一個業(yè)務(wù)流程圖(Business Process Diagram)
    • 討論BPMN的各種的用途:包括以何種精度來影響一個流程圖中的模型
    • BPMN作為一個標(biāo)準(zhǔn)的價值
    • BPMN未來發(fā)展的遠(yuǎn)景
流對象

一個業(yè)務(wù)流程圖有三個流對象的核心元素

  • 事件
    • 一個事件用圓圈來描述,表示一個業(yè)務(wù)流程期間發(fā)生的東西
    • 事件影響流程的流動.一般有一個原因(觸發(fā)器)或一個影響(結(jié)果)
    • 基于它們對流程的影響,有三種事件:開始事件,中間事件,終止事件
      -
  • 活動
    • 用圓角矩形表示,一個流程由一個活動或多個活動組成


      -
  • 條件
    • 條件用菱形表示,用于控制序列流的分支與合并。
    • 可以作為選擇,包括路徑的分支與合并
    • 內(nèi)部的標(biāo)記會給出控制流的類型

Activiti開源工作流框架

Activiti簡介

  • Activiti是一個開源的工作流引擎,它實現(xiàn)了BPMN 2.0規(guī)范,可以發(fā)布設(shè)計好的流程定義,并通過api進(jìn)行流程調(diào)度
  • Activiti 作為一個遵從 Apache 許可的工作流和業(yè)務(wù)流程管理開源平臺,其核心是基于Java的超快速,超穩(wěn)定的 BPMN2.0 流程引擎,強(qiáng)調(diào)流程服務(wù)的可嵌入性和可擴(kuò)展性,同時更加強(qiáng)調(diào)面向業(yè)務(wù)人員
  • Activiti 流程引擎重點關(guān)注在系統(tǒng)開發(fā)的易用性和輕量性上.每一項BPM業(yè)務(wù)功能Activiti流程引擎都以服務(wù)的形式提供給開發(fā)人員.通過使用這些服務(wù),開發(fā)人員能夠構(gòu)建出功能豐富,輕便且高效的BPM應(yīng)用程序

Activiti服務(wù)結(jié)構(gòu)

  • Activiti系統(tǒng)服務(wù)結(jié)構(gòu)圖
    -
  • 核心類:
    • ProcessEngine: 流程引擎的抽象,可以通過此類獲取需要的所有服務(wù)
  • 服務(wù)類:
    • XxxService: 通過ProcessEngine獲取,Activiti將不同生命周期的服務(wù)封裝在不同Service中,包括定義,部署,運(yùn)行.通過服務(wù)類可獲取相關(guān)生命周期中的服務(wù)信息
      • ==RepositoryService==
        • Repository Service提供了對repository的存取服務(wù)
        • Activiti中每一個不同版本的業(yè)務(wù)流程的定義都需要使用一些定義文件,部署文件和支持?jǐn)?shù)據(jù)(例如BPMN2.0XML文件,表單定義文件,流程定義圖像文件等),這些文件都存儲在Activiti內(nèi)建的Repository中
      • ==RuntimeService==
        • Runtime Service提供了啟動流程,查詢流程實例,設(shè)置獲取流程實例變量等功能.此外它還提供了對流程部署,流程定義和流程實例的存取服務(wù)
      • ==TaskService==
        • Task Service提供了對用戶Task和Form相關(guān)的操作.它提供了運(yùn)行時任務(wù)查詢,領(lǐng)取,完成,刪除以及變量設(shè)置等功能
      • ==HistoryService==
        • History Service用于獲取正在運(yùn)行或已經(jīng)完成的流程實例的信息,與Runtime Service中獲取的流程信息不同,歷史信息包含已經(jīng)持久化存儲的永久信息舶沛,并已經(jīng)被針對查詢優(yōu)化
      • ==FormService==
        • 使用Form Service可以存取啟動和完成任務(wù)所需的表單數(shù)據(jù)并且根據(jù)需要來渲染表單
        • Activiti中的流程和狀態(tài)Task均可以關(guān)聯(lián)業(yè)務(wù)相關(guān)的數(shù)據(jù)
      • ==IdentityService==
        • Identity Service提供了對Activiti系統(tǒng)中的用戶和組的管理功能
        • Activiti中內(nèi)置了用戶以及組管理的功能,必須使用這些用戶和組的信息才能獲取到相應(yīng)的Task
      • ManagementService
        • Management Service提供了對Activiti流程引擎的管理和維護(hù)功能
        • 這些功能不在工作流驅(qū)動的應(yīng)用程序中使用还绘,主要用于 Activiti 系統(tǒng)的日常維護(hù)
  • 核心業(yè)務(wù)對象:
    • org.activiti.engine.impl.persistence.entity包下的類,包括Task,ProcessInstance,Execution等
    • 根據(jù)不同職責(zé)實現(xiàn)相應(yīng)接口的方法(如需要持久化則繼承PersistentObject接口),與傳統(tǒng)的實體類不同

Activiti組件

  • ==Activiti上下文組件Context:== 用來保存生命周期比較長,全局性的信息,類似Application.主要包括如下三類:
    • CommandContext: 命令上下文-保存每個命令必要的資源,如持久化需要的session
    • ProcessEngineConfigurationImpl: 流程引擎相關(guān)配置信息-整個引擎全局的配置信息.如數(shù)據(jù)源DataSource等.該對象為單例,在流程引擎創(chuàng)建的時候初始化
    • ExecutionContext: 持有ExecutionEntity對象
  • ==持久化組件:==
    • Activiti使用mybatis作OR映射,并在此基礎(chǔ)上增加設(shè)計了自己的持久化框架
    • 在流程引擎創(chuàng)建時初始化,頂層接口Session,SessionFactory
    • Session有兩個實現(xiàn)類:
      • DbSqlSession: 負(fù)責(zé)sql表達(dá)式的執(zhí)行
      • AbstractManager: 負(fù)責(zé)對象的持久化操作
    • SessionFactory有兩個實現(xiàn)類:
      • DbSqlSessionFactory: 負(fù)責(zé)DbSqlSession相關(guān)操作
      • GenericManagerFactory: 負(fù)責(zé)AbstractManager相關(guān)操作
  • ==Event-Listener組件:==
    • Activiti允許客戶代碼介入流程執(zhí)行,提供了事件監(jiān)聽組件
    • 監(jiān)聽的事件類型:
      • TaskListener
      • JavaDelegate
      • Expression
      • ExecutionListener
      • ProcessEngineConfigurationImpl持有DelegateInterceptor的某個實例,方便調(diào)用handleInvocation
  • ==Cache組件==
    • DbSqlSession中有cache的實現(xiàn)
    • Activiti基于List和Map來做緩存:如查詢時先查緩存,沒有則直接查詢并放入緩存
  • ==異步執(zhí)行組件==
    • Activiti可以執(zhí)行任務(wù),JobExecutor為其核心類,JobExecutor包含三個主要屬性:
      • JobAcquisitionThread
      • BlockingQueue
      • ThreadPoolExecutor
      • 方法ProcessEngines在引擎啟動時調(diào)用JobExecutor.start,JobAcquisitionThread 線程即開始工作,其run方法不斷循環(huán)執(zhí)行AcquiredJobs中的job冈涧,執(zhí)行一次后線程等待一定時間直到超時或者JobExecutor.jobWasAdded方法茂附,因為有新任務(wù)而被調(diào)用正蛙。

流程虛擬機(jī)PVM

  • 流程虛擬機(jī)API暴露了流程虛擬機(jī)的POJO核心,流程虛擬機(jī)API描述了一個工作流流程必備的組件,這些組件包括:
    • PvmProcessDefinition: 流程的定義,形象點說就是用戶畫的那個圖.靜態(tài)含義
    • PvmProcessInstance: 流程實例,用戶發(fā)起的某個PvmProcessDefinition的一個實例.動態(tài)含義
    • PvmActivity: 流程中的一個節(jié)點
    • PvmTransition: 銜接各個節(jié)點之間的路徑,形象點說就是圖中各個節(jié)點之間的連接線
    • PvmEvent: 流程執(zhí)行過程中觸發(fā)的事件

Activiti架構(gòu)

在這里插入圖片描述
  • Activiti Engine:
    • 最核心的模塊
    • 提供針對BPMN 2.0規(guī)范的解析,執(zhí)行,創(chuàng)建,管理(任務(wù),流程實例),查詢歷史記錄并根據(jù)結(jié)果生成報表
  • Activiti Modeler:
    • 模型設(shè)計器
    • 適用于業(yè)務(wù)人員把需求轉(zhuǎn)換為規(guī)范流程定義
  • Activiti Designer:
    • 功能和Activiti Modeler類似,同樣提供了基于BPMN 2.0規(guī)范的可視化設(shè)計功能,但是目前還沒有完全支持BPMN規(guī)范的定義
    • 可以把業(yè)務(wù)需求人員用Signavio設(shè)計的流程定義(XML格式)導(dǎo)入到Designer中,從而讓開發(fā)人員將其進(jìn)一步加工成為可以運(yùn)行的流程定義
  • Activiti Explorer:
    • 可以用來管理倉庫,用戶,組,啟動流程,任務(wù)辦理等
    • 此組件使用REST風(fēng)格API,提供一個基礎(chǔ)的設(shè)計模型.如果業(yè)務(wù)簡單,也可以直接使用無需開發(fā).還可以作為后臺管理員的流程、任務(wù)管理系統(tǒng)使用
  • Activiti REST:
    • 提供RESTful風(fēng)格的服務(wù)
    • 允許客戶端以JSON的方式與引擎的REST API交互
    • 通用的協(xié)議具有跨平臺,跨語言的特性

Activiti數(shù)據(jù)庫支持

  • Activiti的后臺由有數(shù)據(jù)庫的支持
  • 所有的表都以ACT_開頭
  • 第二部分是表示表的用途的兩個字母標(biāo)識
  • 用途也和服務(wù)的API對應(yīng)
ACT_RE_* : 'RE'表示repository. 這個前綴的表包含了流程定義和流程靜態(tài)資源(圖片,規(guī)則...)
ACT_RU_* : 'RU'表示runtime.這些運(yùn)行時的表,  包含流程實例,任務(wù),變量,異步任務(wù),等運(yùn)行中的數(shù)據(jù).
            Activiti只在流程實例執(zhí)行過程中保存這些數(shù)據(jù),在流程結(jié)束時就會刪除這些記錄.這樣運(yùn)行時表可以一直很小速度很快
ACT_ID_* : 'ID'表示identity.這些表包含身份信息,  比如用戶,組...
ACT_HI_* : 'HI'表示history.這些表包含歷史數(shù)據(jù),  比如歷史流程實例,變量,任務(wù)...
ACT_GE_* :通用數(shù)據(jù). 用于不同場景下,  如存放資源文件
  • 資源庫流程規(guī)則表 (ACT_RE_*:'RE'表示repository. 這個前綴的表包含了流程定義和流程靜態(tài)資源(圖片,規(guī)則...))
act_re_deployment       部署信息表
act_re_model            流程設(shè)計模型部署表
act_re_procdef          流程定義數(shù)據(jù)表
  • 運(yùn)行時數(shù)據(jù)庫表 (ACT_RU_*:'RU'表示runtime.這些運(yùn)行時的表, 包含流程實例,任務(wù),變量,異步任務(wù),等運(yùn)行中的數(shù)據(jù).Activiti只在流程實例執(zhí)行過程中保存這些數(shù)據(jù),在流程結(jié)束時就會刪除這些記錄.這樣運(yùn)行時表可以一直很小速度很快)
act_ru_execution        運(yùn)行時流程執(zhí)行實例表
act_ru_identitylink     運(yùn)行時流程人員表,主要存儲任務(wù)節(jié)點與參與者的相關(guān)信息
act_ru_task             運(yùn)行時任務(wù)節(jié)點表
act_ru_variable         運(yùn)行時流程變量數(shù)據(jù)表
  • 組織機(jī)構(gòu)表 (ACT_ID_* : 'ID'表示identity.這些表包含身份信息, 比如用戶,組...)
act_id_group            用戶組信息表
act_id_info             用戶擴(kuò)展信息表
act_id_membership       用戶與用戶組對應(yīng)信息表
act_id_user             用戶信息表


這四張表很常見,基本的組織機(jī)構(gòu)管理,關(guān)于用戶認(rèn)證方面建議還是自己開發(fā)一套,組件自帶的功能太簡單,使用中有很多需求難以滿足
  • 歷史數(shù)據(jù)庫表 (ACT_HI_*:'HI'表示history.這些表包含歷史數(shù)據(jù), 比如歷史流程實例,變量,任務(wù)...)
act_hi_actinst          歷史節(jié)點表
act_hi_attachment       歷史附件表
act_hi_comment          歷史意見表
act_hi_identitylink     歷史流程人員表
act_hi_detail           歷史詳情表营曼,提供歷史變量的查詢
act_hi_procinst         歷史流程實例表
act_hi_taskinst         歷史任務(wù)實例表
act_hi_varinst          歷史變量表
  • 組織機(jī)構(gòu)表 (ACT_GE_*:通用數(shù)據(jù). 用于不同場景下, 如存放資源文件)
act_ge_bytearray        二進(jìn)制數(shù)據(jù)表
act_ge_property         屬性數(shù)據(jù)表存儲整個流程引擎級別的數(shù)據(jù),初始化表結(jié)構(gòu)時,會默認(rèn)插入三條記錄
Activiti配置文件
  • activiti.cfg.xml: Activiti核心配置文件乒验,配置流程引擎創(chuàng)建工具的基本參數(shù)和數(shù)據(jù)庫連接池參數(shù)
    • 定義數(shù)據(jù)庫配置參數(shù)
    • 配置連接池參數(shù)

Activiti特點

數(shù)據(jù)持久化
  • Activiti的設(shè)計思想是簡潔,快速
  • 瓶頸體現(xiàn)在和數(shù)據(jù)庫交換數(shù)據(jù)的過程中,針對這一點Activiti選擇了使MyBatis,從而可以通過最優(yōu)的SQL語句執(zhí)行Command,僅憑如此就能讓引擎在速度上保持最高的性能
引擎service接口
  • Activiti流程引擎重點關(guān)注在系統(tǒng)開發(fā)的易用性和輕量性上,每一項BPM業(yè)務(wù)功能Activiti流程引擎都以服務(wù)的形式提供給開發(fā)人員,通過使用這些服務(wù),開發(fā)人員能夠構(gòu)建出功能豐富,輕便且高效的BPM應(yīng)用程序
  • activiti.cfg.xml文件為核心配置文件,該配置文件集成在Spring的IOC容器當(dāng)中,可以產(chǎn)生ProcessEngineConfiguration對象,這個對象就是流程引擎的配置對象
  • ProcessEngine對象為流程引擎對象,該對象是工作流業(yè)務(wù)系統(tǒng)的核心,所有的業(yè)務(wù)操作都是由這個對象所派生出來的對象實現(xiàn)
  • Activiti引擎提供了七大Service接口,均通過ProcessEngine獲取,并且支持鏈?zhǔn)紸PI編程風(fēng)格
流程設(shè)計器
  • 基于Web的Activiti Modeler流程設(shè)計器
  • IDEA的actiBPM插件
原生支持Spring
  • Activiti原生支持Spring,可以很輕松地進(jìn)行Spring集成,非常方便管理事務(wù)和解析表達(dá)式(Expression)
分離運(yùn)行時與歷史數(shù)據(jù)
  • Activiti繼承自jBPM4,在表結(jié)構(gòu)設(shè)計方面也遵循運(yùn)行時與歷史數(shù)據(jù)的分離
  • 這樣的設(shè)計可以快速讀取運(yùn)行時數(shù)據(jù),僅當(dāng)需要查詢歷史數(shù)據(jù)時再從專門的歷史數(shù)據(jù)表中讀取.這種設(shè)計方式可以大幅提高數(shù)據(jù)的存取效率,尤其是當(dāng)數(shù)據(jù)日積月累時依然能夠快速反應(yīng)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒂阱,一起剝皮案震驚了整個濱河市锻全,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌录煤,老刑警劉巖鳄厌,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辐赞,居然都是意外死亡部翘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門响委,熙熙樓的掌柜王于貴愁眉苦臉地迎上來新思,“玉大人,你說我怎么就攤上這事赘风〖星簦” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵邀窃,是天一觀的道長荸哟。 經(jīng)常有香客問我,道長瞬捕,這世上最難降的妖魔是什么鞍历? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮肪虎,結(jié)果婚禮上劣砍,老公的妹妹穿的比我還像新娘。我一直安慰自己扇救,他們只是感情好刑枝,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迅腔,像睡著了一般装畅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沧烈,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天掠兄,我揣著相機(jī)與錄音,去河邊找鬼。 笑死徽千,一個胖子當(dāng)著我的面吹牛苫费,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播双抽,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼百框,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牍汹?” 一聲冷哼從身側(cè)響起铐维,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慎菲,沒想到半個月后嫁蛇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡露该,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年睬棚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片解幼。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抑党,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撵摆,到底是詐尸還是另有隱情底靠,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布特铝,位于F島的核電站暑中,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鲫剿。R本人自食惡果不足惜鳄逾,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灵莲。 院中可真熱鬧严衬,春花似錦、人聲如沸笆呆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赠幕。三九已至,卻和暖如春询筏,著一層夾襖步出監(jiān)牢的瞬間榕堰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留逆屡,地道東北人圾旨。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像魏蔗,于是被迫代替她去往敵國和親砍的。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容