官术网_书友最值得收藏!

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é)流程資源的部署。

主站蜘蛛池模板: 阳城县| 蚌埠市| 嘉祥县| 颍上县| 莲花县| 新津县| 贵南县| 铁岭市| 青冈县| 凤阳县| 桦甸市| 那坡县| 连云港市| 怀来县| 泰兴市| 长白| 金川县| 秦安县| 平罗县| 独山县| 金昌市| 龙泉市| 福贡县| 龙井市| 宣化县| 新安县| 碌曲县| 四子王旗| 忻城县| 泰安市| 凤山县| 老河口市| 会东县| 滨海县| 汨罗市| 海兴县| 陵水| 县级市| 溆浦县| 安福县| 吉首市|