- Activiti權(quán)威指南
- 冀正
- 1652字
- 2020-11-28 15:59:57
3.1 流程資源概述
本節(jié)主要講解流程資源部署及其相關(guān)源碼,包含如何部署、部署到何地、部署的流程資源怎么進(jìn)行刪除和更新操作、如何選擇最優(yōu)部署方案等,通常所說的流程資源包含如下。
(1)流程文檔:流程文檔的擴(kuò)展名一般為bpmn20.xml或者bpmn,例如shareniu. bpmn20.xml。
(2)圖片:根據(jù)流程文檔內(nèi)容生成的圖片,擴(kuò)展名一般為Png。
(3)Drools規(guī)則文件:通常情況下擴(kuò)展名為drl。
(4)Form表單文件:通常情況下擴(kuò)展名為form。
約定
本書中如果沒有特殊說明,流程資源等價(jià)于流程文檔。
3.1.1 流程文檔部署生命周期
在開始學(xué)習(xí)流程文檔部署之前,先了解流程文檔部署的生命周期,如圖3-1所示。

圖3-1 流程文檔部署生命周期
根據(jù)圖3-1,可以把流程文檔部署的生命周期分為四大步驟。
(1)定義流程文檔:客戶端可以根據(jù)自己的業(yè)務(wù)需求定義流程文檔。
(2)啟動(dòng)流程引擎:流程引擎啟動(dòng)之后會(huì)自動(dòng)構(gòu)造ProcessEngine實(shí)例對象,這樣客戶端就可以通過該實(shí)例對象獲取各種各樣的服務(wù)類實(shí)例對象。例如,TaskService實(shí)例對象,這一系列的服務(wù)類實(shí)例對象為客戶端的操作提供便利。
(3)部署流程文檔:調(diào)用流程文檔部署命令進(jìn)行部署,該過程只需要客戶端調(diào)用部署流程文檔的命令即可,流程引擎收到命令之后開始進(jìn)行如下操作。
? 將流程文檔中定義的元素解析為Activiti的內(nèi)部表示BaseElement實(shí)例。
? 對BaseElement實(shí)例對象再次解析,進(jìn)而將其轉(zhuǎn)化為流程虛擬機(jī)中的ActivityImpl實(shí)例對象或者TransitionImpl實(shí)例對象,該過程非常重要,也是將BaseElement實(shí)例對象注入流程虛擬機(jī)的過程。
(4)添加緩存:以上所有步驟完成之后,緩存流程定義信息,這樣后續(xù)節(jié)點(diǎn)運(yùn)轉(zhuǎn)的時(shí)候,只需從緩存中取值即可,無須再次執(zhí)行以上的步驟,從而大幅提升性能,流程引擎默認(rèn)開啟了緩存功能,后續(xù)章節(jié)會(huì)深入講解緩存機(jī)制。
3.1.2 DeploymentBuilder核心類
接下來詳細(xì)講解流程文檔部署操作,首先明確一點(diǎn),不管開發(fā)人員使用何種方式部署流程文檔,最終均是通過流程引擎提供的API進(jìn)行操作。流程文檔的部署步驟是首先通過ProcessEngine接口的實(shí)現(xiàn)類獲取到部署服務(wù)類RepositoryService實(shí)例對象,然后借助該實(shí)例對象中的createDeployment方法創(chuàng)建DeploymentBuilder實(shí)例對象,DeploymentBuilder接口的默認(rèn)實(shí)現(xiàn)類為DeploymentBuilderImpl,經(jīng)過前面的一系列步驟之后,就可以獲取DeploymentBuilder類型的實(shí)例對象,然后通過該實(shí)例對象調(diào)用不同的資源部署API進(jìn)行流程資源的部署操作。首先分析DeploymentBuilder接口的定義,如代碼清單3-1所示。
代碼清單3-1 DeploymentBuilder.java

該接口提供的方法以及重要參數(shù)說明如下。
(1)inputStream參數(shù):流程文檔最終的數(shù)據(jù)流,對應(yīng)數(shù)據(jù)庫ACT_GE_BYTEARRAY表中的BYTES_列。
(2)resourceName參數(shù):資源名稱,對應(yīng)ACT_GE_BYTEARRAY表中的NAME_列。如果客戶端沒有干預(yù)部署器的初始化,則資源名稱必須以.bpmn20.xml或者.bpmn作為后綴,如shareniu.bpmn20.xml,否則流程文檔無法完整部署,進(jìn)而導(dǎo)致客戶端無法啟用相應(yīng)的流程實(shí)例(因?yàn)橘Y源名稱沒有被引擎驗(yàn)證通過,ACT_RE_PROCDEF表中不會(huì)產(chǎn)生數(shù)據(jù)),關(guān)于這一點(diǎn)后續(xù)的源碼講解會(huì)詳細(xì)闡述該內(nèi)部處理機(jī)制,如果有興趣可以嘗試定義一個(gè)流程文檔,然后在部署流程文檔時(shí)顯式指定資源名稱,進(jìn)而觀察數(shù)據(jù)庫中的數(shù)據(jù)變化。看到這里可能會(huì)有疑惑:流程文檔的后綴應(yīng)該是.bpmn20.xml或者.bpmn,在這里需要強(qiáng)調(diào)一點(diǎn)資源名稱的后綴與流程文檔的后綴名完全是兩個(gè)概念,在部署流程文檔時(shí),必須確保資源名稱的后綴如上所說,需要注意的是如果使用addZipInputStream方式部署流程資源,則需要確保流程文檔的后綴為.bpmn20.xml或者.bpmn,因?yàn)樵摲绞讲渴鹳Y源時(shí)不能顯式指定資源名稱,所以使用該方式部署資源時(shí),資源名稱默認(rèn)為壓縮包中的流程文檔名稱,相關(guān)實(shí)現(xiàn)邏輯可以跟進(jìn)DeploymentBuilderImpl類中的addZipInputStream方法。
(3)addInputStream方法:使用數(shù)據(jù)流的方式部署流程資源(流程文檔和流程定義圖片等)。
(4)addClasspathResource方法:使用classpath方式直接讀取項(xiàng)目中classpath目錄下指定的流程資源進(jìn)行部署。
(5)addZipInputStream方法:將流程資源文件(流程文檔和流程定義圖片等)打包部署。例如,將流程文檔XML和生成的流程定義圖片,一般是.Png格式(非必須)打包為.zip或者.bar格式。該方式支持多個(gè)流程資源文件一次性打包部署(批量部署)。
(6)addString方式:通過字符串方式部署流程文檔。例如,定義一個(gè)流程文檔之后,將文檔的內(nèi)容讀取出來然后直接使用該方式進(jìn)行部署。
(7)addBpmnModel方式:通過構(gòu)造BpmnModel實(shí)例對象進(jìn)行流程資源的部署。該方式比較適合開發(fā)人員自定義流程設(shè)計(jì)器,可控性和擴(kuò)展性比較強(qiáng)。
(8)deploy方法:流程資源部署的核心方法,負(fù)責(zé)流程資源的部署。
- DevOps:軟件架構(gòu)師行動(dòng)指南
- Node.js 10實(shí)戰(zhàn)
- Learning SAP Analytics Cloud
- VSTO開發(fā)入門教程
- PHP網(wǎng)絡(luò)編程學(xué)習(xí)筆記
- Learning Neo4j 3.x(Second Edition)
- HTML5入門經(jīng)典
- 學(xué)習(xí)正則表達(dá)式
- Keras深度學(xué)習(xí)實(shí)戰(zhàn)
- Extreme C
- Django 3.0入門與實(shí)踐
- Serverless Web Applications with React and Firebase
- Photoshop CC移動(dòng)UI設(shè)計(jì)案例教程(全彩慕課版·第2版)
- Python編程快速上手2
- 面向?qū)ο蟪绦蛟O(shè)計(jì)及C++(第3版)