|
pvm是什么? PVM(Process Virtual Machine):流程虛擬機(jī)。 官方解釋: 流程虛擬機(jī)-一種可嵌入的、原生的支持多流程語(yǔ)言的獨(dú)立技術(shù)。 流程虛擬機(jī)是一個(gè)用來(lái)構(gòu)建和執(zhí)行流程圖的簡(jiǎn)單的java類庫(kù)。它充當(dāng)各種工作流、業(yè)務(wù)流程管理和編制流程語(yǔ)言的基礎(chǔ)。 流程虛擬機(jī)是多流程語(yǔ)言的基礎(chǔ)。對(duì)任何流程語(yǔ)言的原生支持都可以建立在流程虛擬機(jī)之上。流程圖中每個(gè)活動(dòng)的運(yùn)行期行為被委托給一個(gè)java的接口。流程語(yǔ)言是一套活動(dòng)類型的集合。一個(gè)活動(dòng)實(shí)現(xiàn)運(yùn)行期行為并且對(duì)應(yīng)一個(gè)活動(dòng)類型。因此在流程虛擬機(jī)上建立一個(gè)流程語(yǔ)言就和創(chuàng)建一套活動(dòng)實(shí)現(xiàn)一樣簡(jiǎn)單。通過(guò)相同的機(jī)制,像jpdl這種語(yǔ)言是很容易擴(kuò)展的。 說(shuō)白了,在activiti中就是一堆java類庫(kù),支持流程的所有運(yùn)行期的運(yùn)轉(zhuǎn),包括啟動(dòng)、停止、審批等等。 PVM是做什么的? PVM主要就是負(fù)責(zé)流程整個(gè)運(yùn)行期的執(zhí)行、流轉(zhuǎn)等所有運(yùn)行過(guò)程。 PVM何時(shí)被調(diào)用? PVM從啟動(dòng)開(kāi)始,一直到流程的結(jié)束,包括啟動(dòng)、停止、審批流程等有關(guān)于改變流程的操作,都要調(diào)用pvm來(lái)實(shí)現(xiàn)。 activiti中是如何實(shí)現(xiàn)pvm的? activiti中pvm的設(shè)計(jì)實(shí)現(xiàn)非常巧妙,下面通過(guò)源碼解析,來(lái)了解activiti中pvm的實(shí)現(xiàn)。 activiti對(duì)pvm的實(shí)現(xiàn)都放在org.activiti.engine.impl.pvm包里。 1.面向?qū)ο蟮脑O(shè)計(jì): 眾所周知,activiti是通過(guò)bpmn2.0規(guī)范來(lái)設(shè)計(jì),每個(gè)流程包括開(kāi)始節(jié)點(diǎn)、結(jié)束節(jié)點(diǎn)、Task節(jié)點(diǎn)、以及連接線走向和各種way。 activiti在pvm中,將每個(gè)流程元素設(shè)計(jì)成對(duì)象,類圖如下: a.PvmActivity:活動(dòng)節(jié)點(diǎn),在流程圖上對(duì)應(yīng)開(kāi)始節(jié)點(diǎn)、結(jié)束節(jié)點(diǎn)、各種任務(wù)節(jié)點(diǎn)、各種菱形代表的聚合節(jié)點(diǎn)。 b.PvmTransition:連接線。 c.PvmProcessDefinition:流程定義(全局)。 以上為activiti元素與pvm對(duì)象的映射關(guān)系,那么是誰(shuí)通過(guò)這些對(duì)象來(lái)運(yùn)行的流程呢? 2.面向行為的設(shè)計(jì) pvm運(yùn)行期的操作類,都放在org.activiti.engine.impl.pvm.runtime包中。 activiti中對(duì)流程的操作都封裝為特定的操作(Operation),如流程啟動(dòng)、流程結(jié)束、任務(wù)啟動(dòng)、任務(wù)執(zhí)行、任務(wù)結(jié)束等。每個(gè)具體的操作控制每個(gè)具體點(diǎn)流程運(yùn)行邏輯。如任務(wù)啟動(dòng)操作行為會(huì)觸發(fā)監(jiān)聽(tīng)器、流程任務(wù)等。 下面為流程運(yùn)行期的操作設(shè)計(jì),如圖: 通過(guò)名字不難看出,每個(gè)操作都封裝成了一個(gè)操作行為,如: AtomicOperationProcessStart,代表流程啟動(dòng)操作行為 AtomicOperationProcessEnd,代表流程結(jié)束操作行為 等等。 這里的操作行為是針對(duì)于通用的流程的運(yùn)轉(zhuǎn)。而流程的任務(wù)分為多種類型,如Usertask/mailtask/ReceiveTask/以及子流程等。根據(jù)類型的不同,行為也是不同的,activiti中是這樣設(shè)計(jì)的:運(yùn)用委托模式,將每種類型的行為封裝成一個(gè)單獨(dú)的行為類,在執(zhí)行不同的類型任務(wù)是,將該類型的行為對(duì)象賦值給ActivityImpl,ActivityImpl運(yùn)行時(shí),將行為委托給這個(gè)行為對(duì)象,行為對(duì)象在調(diào)用pvm的操作,就完成了流程的運(yùn)轉(zhuǎn)。 pvm的委托行為總接口都放在org.activiti.engine.impl.pvm.delegate包中。 acitiviti 具體的任務(wù)委托行為類都放在org.activiti.engine.impl.bpmn.behavior包中。 下面為部分的委托類圖,如圖: 本篇主要介紹pvm的基本結(jié)構(gòu)和大體的調(diào)用關(guān)系,至于詳細(xì)的調(diào)用過(guò)程,后續(xù)會(huì)從啟動(dòng)、審批、結(jié)束,整個(gè)流程周期為出發(fā)點(diǎn)詳細(xì)解讀。 |
|
|
來(lái)自: 賈朋亮博客 > 《Activiti研究》