工作流
工作流簡介
-
工作流(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ù)
-
==RepositoryService==
-
XxxService: 通過ProcessEngine獲取,Activiti將不同生命周期的服務(wù)封裝在不同Service中,包括定義,部署,運(yùn)行.通過服務(wù)類可獲取相關(guān)生命周期中的服務(wù)信息
-
核心業(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)用正蛙。
- Activiti可以執(zhí)行任務(wù),JobExecutor為其核心類,JobExecutor包含三個主要屬性:
流程虛擬機(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)