Activiti工作流淺析
一、工作流
1、工作流概述
在一個(gè)公司業(yè)務(wù)中,每一個(gè)業(yè)務(wù)的開(kāi)始和結(jié)束,都可以理解成為一個(gè)工作流。例如公司請(qǐng)假的基本流程。
如圖所示,員工先提出請(qǐng)假申請(qǐng),提交該申請(qǐng)給直屬領(lǐng)導(dǎo)審批,直屬領(lǐng)導(dǎo)審批后,再提交給人事部門(mén)審批,審批完成后,通知提出申請(qǐng)的員工,即請(qǐng)假流程結(jié)束。整個(gè)步驟按照正常工作方式一步步完成,這就是一個(gè)簡(jiǎn)單而又完整的工作流;工作流可以理解為從開(kāi)始節(jié)點(diǎn)發(fā)起流程,然后經(jīng)過(guò)其中多個(gè)節(jié)點(diǎn),完成動(dòng)作,最后到結(jié)束節(jié)點(diǎn)的整個(gè)過(guò)程。
在沒(méi)有工作流引擎之前,為了實(shí)現(xiàn)上述的流程控制,開(kāi)發(fā)人員最常用的做法是采用狀態(tài)值跟蹤流程的狀態(tài)變化,假設(shè)初始值為0,每一個(gè)流程的流轉(zhuǎn),狀態(tài)值+1,然后給出相應(yīng)的處理邏輯??梢钥闯龉ぷ鞯牧鞒毯蜆I(yè)務(wù)高度耦合,當(dāng)流程發(fā)生變化時(shí),我們的業(yè)務(wù)代碼也要做出同等的調(diào)整。
如果有一個(gè)工具幫助我們管理工作流,當(dāng)業(yè)務(wù)流程變化后,程序不需要發(fā)生變化,最終將會(huì)讓我們的開(kāi)發(fā)能力和業(yè)務(wù)能力大幅提升。于是乎,工作流引擎應(yīng)運(yùn)而生!
二、Activiti介紹
1、簡(jiǎn)介
- Activiti是一個(gè)開(kāi)源的工作流引擎,它實(shí)現(xiàn)了BPMN 2.0規(guī)范,可以發(fā)布設(shè)計(jì)好的流程定義,并通過(guò)api進(jìn)行流程調(diào)度
- Activiti是一種輕量級(jí),可嵌入的BPM引擎,可以將復(fù)雜的業(yè)務(wù)流程抽取出來(lái),然后使用專(zhuān)門(mén)的建模語(yǔ)言BPMN2.0定義執(zhí)行流程,最終業(yè)務(wù)系統(tǒng)通過(guò)訪問(wèn)Activiti的接口去驅(qū)動(dòng)預(yù)定義的流程執(zhí)行
- Activiti 流程引擎重點(diǎn)關(guān)注在系統(tǒng)開(kāi)發(fā)的易用性和輕量性上.每一項(xiàng)BPM業(yè)務(wù)功能Activiti流程引擎都以服務(wù)的形式提供給開(kāi)發(fā)人員.通過(guò)使用這些服務(wù),開(kāi)發(fā)人員能夠構(gòu)建出功能豐富,輕便且高效的BPM應(yīng)用程序
2、Activiti服務(wù)架構(gòu)
activiti.cfg.xml:
Activiti核心配置文件,配置流程引擎創(chuàng)建工具的基本參數(shù)和數(shù)據(jù)庫(kù)連接池參數(shù)
核心類(lèi):
?ProcessEngine: 流程引擎的抽象,可以通過(guò)此類(lèi)獲取需要的所有服務(wù)
服務(wù)類(lèi):
- XxxService: 通過(guò)ProcessEngine獲取,Activiti將不同生命周期的服務(wù)封裝在不同Service中,包括定義,部署,運(yùn)行.通過(guò)服務(wù)類(lèi)可獲取相關(guān)生命周期中的服務(wù)信息
- RepositoryServiceRepository Service提供了對(duì)repository的存取服務(wù) Activiti中每一個(gè)不同版本的業(yè)務(wù)流程的定義都需要使用一些定義文件,部署文件和支持?jǐn)?shù)據(jù)(例如BPMN2.0XML文件,表單定義文件,流程定義圖像文件等),這些文件都存儲(chǔ)在Activiti內(nèi)建的Repository中
- RuntimeServiceRuntime Service提供了啟動(dòng)流程,查詢流程實(shí)例,設(shè)置獲取流程實(shí)例變量等功能.此外它還提供了對(duì)流程部署,流程定義和流程實(shí)例的存取服務(wù)
- TaskServiceTask Service提供了對(duì)用戶Task和Form相關(guān)的操作.它提供了運(yùn)行時(shí)任務(wù)查詢,領(lǐng)取,完成,刪除以及變量設(shè)置等功能
- HistoryServiceHistory Service用于獲取正在運(yùn)行或已經(jīng)完成的流程實(shí)例的信息,與Runtime Service中獲取的流程信息不同,歷史信息包含已經(jīng)持久化存儲(chǔ)的永久信息,并已經(jīng)被針對(duì)查詢優(yōu)化
- FormService使用Form Service可以存取啟動(dòng)和完成任務(wù)所需的表單數(shù)據(jù)并且根據(jù)需要來(lái)渲染表單 Activiti中的流程和狀態(tài)Task均可以關(guān)聯(lián)業(yè)務(wù)相關(guān)的數(shù)據(jù)
- IdentityServiceIdentity Service提供了對(duì)Activiti系統(tǒng)中的用戶和組的管理功能 Activiti中內(nèi)置了用戶以及組管理的功能,必須使用這些用戶和組的信息才能獲取到相應(yīng)的Task
- ManagementServiceManagement Service提供了對(duì)Activiti流程引擎的管理和維護(hù)功能 這些功能不在工作流驅(qū)動(dòng)的應(yīng)用程序中使用,主要用于 Activiti 系統(tǒng)的日常維護(hù)
組件
- 持久化組件:
?Activiti使用mybatis作OR映射,并在此基礎(chǔ)上增加設(shè)計(jì)了自己的持久化框架在流程引擎創(chuàng)建時(shí)初始化,頂層接口Session,SessionFactorySession有兩個(gè)實(shí)現(xiàn)類(lèi):DbSqlSession: 負(fù)責(zé)sql表達(dá)式的執(zhí)行AbstractManager: 負(fù)責(zé)對(duì)象的持久化操作SessionFactory有兩個(gè)實(shí)現(xiàn)類(lèi):DbSqlSessionFactory: 負(fù)責(zé)DbSqlSession相關(guān)操作GenericManagerFactory: 負(fù)責(zé)AbstractManager相關(guān)操作
- Event-Listener組件:
Activiti允許客戶代碼介入流程執(zhí)行,提供了事件監(jiān)聽(tīng)組件監(jiān)聽(tīng)的事件類(lèi)型:TaskListener、JavaDelegate、Expression、ExecutionListener、ProcessEngineConfigurationImpl持有DelegateInterceptor的某個(gè)實(shí)例,方便調(diào)用handleInvocation
- Cache組件:
DbSqlSession中有cache的實(shí)現(xiàn)Activiti基于List和Map來(lái)做緩存:如查詢時(shí)先查緩存,沒(méi)有則直接查詢并放入緩存
- 異步執(zhí)行組件:
Activiti可以執(zhí)行任務(wù),JobExecutor為其核心類(lèi),JobExecutor包含三個(gè)主要屬性:JobAcquisitionThread、BlockingQueue、ThreadPoolExecutor,方法ProcessEngines在引擎啟動(dòng)時(shí)調(diào)用JobExecutor.start,JobAcquisitionThread 線程即開(kāi)始工作,其run方法不斷循環(huán)執(zhí)行AcquiredJobs中的job,執(zhí)行一次后線程等待一定時(shí)間直到超時(shí)或者JobExecutor.jobWasAdded方法,因?yàn)橛行氯蝿?wù)而被調(diào)用。
- 上下文組件Context:
用來(lái)保存生命周期比較長(zhǎng),全局性的信息,類(lèi)似Application.主要包括如下三類(lèi):CommandContext: 命令上下文-保存每個(gè)命令必要的資源,如持久化需要的sessionProcessEngineConfigurationImpl: 流程引擎相關(guān)配置信息-整個(gè)引擎全局的配置信息.如數(shù)據(jù)源DataSource等.該對(duì)象為單例,在流程引擎創(chuàng)建的時(shí)候初始化ExecutionContext: 持有ExecutionEntity對(duì)象
3、Activiti數(shù)據(jù)庫(kù)支持
- 所有的表都以ACT_開(kāi)頭
- 第二部分是表示表的用途的兩個(gè)字母標(biāo)識(shí)
- 用途也和服務(wù)的API對(duì)應(yīng)
資源庫(kù)流程規(guī)則表說(shuō)明:
運(yùn)行時(shí)數(shù)據(jù)庫(kù)表說(shuō)明:
組織結(jié)構(gòu)表說(shuō)明:
4、BPM/BPMN介紹
BPM(Business Process Management),即業(yè)務(wù)流程管理,是一種規(guī)范化的構(gòu)造端到端的業(yè)務(wù)流程,以持續(xù)的提高組織業(yè)務(wù)效率。常見(jiàn)商業(yè)管理教育如EMBA、MBA等均將BPM包含在內(nèi)。BPMN(Business Process Model AndNotation)即業(yè)務(wù)流程模型和符號(hào),是一套標(biāo)準(zhǔn)的業(yè)務(wù)流程建模符號(hào),使用 BPMN 提供的符號(hào)可以創(chuàng)建業(yè)務(wù)流程。Activiti 就是使用 BPMN 進(jìn)行流程建模、流程執(zhí)行管理的。BPMN2.0 是業(yè)務(wù)流程建模符號(hào) 2.0 的縮寫(xiě),它由 Business Process Management Initiative 這個(gè)非營(yíng)利協(xié)會(huì)創(chuàng)建并不斷發(fā)展。BPMN2.0 是使用一些符號(hào)來(lái)明確業(yè)務(wù)流程設(shè)計(jì)流程圖的一套符號(hào)規(guī)范,能增進(jìn)業(yè)務(wù)建模時(shí)的溝通效率。目前 BPMN2.0 是最新的版本,它用于在 BPM 上下文中進(jìn)行布局和可視化的溝通
BPMN2.0基本符號(hào)介紹
簡(jiǎn)要列表如下:
三、springboot整合Activiti
- 新建springboot項(xiàng)目
- pom.xml導(dǎo)入相關(guān)依賴
- 在resource目錄下新建process目錄作為*.bmnp的存儲(chǔ)路徑
- application.yml配置
- idea安裝插件Activiti BPMN visualizer,創(chuàng)建流程圖
打開(kāi)該文件,右鍵選中如圖:
最終會(huì)生成xml文件:
通過(guò)讀取png和bmnp獲取請(qǐng)假流程:
四、考慮使用Activiti的場(chǎng)景
1、關(guān)鍵業(yè)務(wù)流程: 訂單、報(bào)價(jià)處理、合同審核、客戶電話處理、供應(yīng)鏈管理等
2、行政管理類(lèi):出差申請(qǐng)、加班申請(qǐng)、請(qǐng)假申請(qǐng)、用車(chē)申請(qǐng)、各種辦公用品申請(qǐng)、購(gòu)買(mǎi)申請(qǐng)、日?qǐng)?bào)周報(bào)等
3、人事管理類(lèi): 員工培訓(xùn)安排、績(jī)效考評(píng)、職位變動(dòng)處理、員工檔案信息管理等。
4、財(cái)務(wù)相關(guān)類(lèi): 付款請(qǐng)求、應(yīng)收款處理、日常報(bào)銷(xiāo)處理、出差報(bào)銷(xiāo)、預(yù)算和計(jì)劃申請(qǐng)等。
5、客戶服務(wù)類(lèi): 客戶信息管理、客戶投訴、請(qǐng)求處理、售后服務(wù)管理等。
五、總結(jié)
從公司講,工作流系統(tǒng)規(guī)范了公司的業(yè)務(wù)流程,優(yōu)化了企業(yè)內(nèi)部的管理,提高了團(tuán)隊(duì)間地協(xié)作效率,能夠幫助企業(yè)向知識(shí)型企業(yè)轉(zhuǎn)變。
作為技術(shù)開(kāi)發(fā)人員,Activiti在小項(xiàng)目中基于串行并行流轉(zhuǎn)能夠基本滿足業(yè)務(wù)和開(kāi)發(fā)的需求;但是Activiti對(duì)于技術(shù)的要求門(mén)檻相對(duì)較高,二次開(kāi)發(fā)難度大,需要技術(shù)人員不斷提升和學(xué)習(xí),在實(shí)戰(zhàn)中研發(fā)出具有極高價(jià)值的工作流系統(tǒng)。