pvm是什么? PVM(Process Virtual Machine):流程虚拟机。 官方解释: 流程虚拟机-一种可嵌入的、原生的支持多流程语言的独立技术。 流程虚拟机是一个用来构建和执行流程图的简单的java类库。它充当各种工作流、业务流程管理和编制流程语言的基础。 流程虚拟机是多流程语言的基础。对任何流程语言的原生支持都可以建立在流程虚拟机之上。流程图中每个活动的运行期行为被委托给一个java的接口。流程语言是一套活动类型的集合。一个活动实现运行期行为并且对应一个活动类型。因此在流程虚拟机上建立一个流程语言就和创建一套活动实现一样简单。通过相同的机制,像jpdl这种语言是很容易扩展的。 说白了,在activiti中就是一堆java类库,支持流程的所有运行期的运转,包括启动、停止、审批等等。 PVM是做什么的? PVM主要就是负责流程整个运行期的执行、流转等所有运行过程。 PVM何时被调用? PVM从启动开始,一直到流程的结束,包括启动、停止、审批流程等有关于改变流程的操作,都要调用pvm来实现。 activiti中是如何实现pvm的? activiti中pvm的设计实现非常巧妙,下面通过源码解析,来了解activiti中pvm的实现。 activiti对pvm的实现都放在org.activiti.engine.impl.pvm包里。 1.面向对象的设计: 众所周知,activiti是通过bpmn2.0规范来设计,每个流程包括开始节点、结束节点、Task节点、以及连接线走向和各种way。 activiti在pvm中,将每个流程元素设计成对象,类图如下: a.PvmActivity:活动节点,在流程图上对应开始节点、结束节点、各种任务节点、各种菱形代表的聚合节点。 b.PvmTransition:连接线。 c.PvmProcessDefinition:流程定义(全局)。 以上为activiti元素与pvm对象的映射关系,那么是谁通过这些对象来运行的流程呢? 2.面向行为的设计 pvm运行期的操作类,都放在org.activiti.engine.impl.pvm.runtime包中。 activiti中对流程的操作都封装为特定的操作(Operation),如流程启动、流程结束、任务启动、任务执行、任务结束等。每个具体的操作控制每个具体点流程运行逻辑。如任务启动操作行为会触发监听器、流程任务等。 下面为流程运行期的操作设计,如图: 通过名字不难看出,每个操作都封装成了一个操作行为,如: AtomicOperationProcessStart,代表流程启动操作行为 AtomicOperationProcessEnd,代表流程结束操作行为 等等。 这里的操作行为是针对于通用的流程的运转。而流程的任务分为多种类型,如Usertask/mailtask/ReceiveTask/以及子流程等。根据类型的不同,行为也是不同的,activiti中是这样设计的:运用委托模式,将每种类型的行为封装成一个单独的行为类,在执行不同的类型任务是,将该类型的行为对象赋值给ActivityImpl,ActivityImpl运行时,将行为委托给这个行为对象,行为对象在调用pvm的操作,就完成了流程的运转。 pvm的委托行为总接口都放在org.activiti.engine.impl.pvm.delegate包中。 acitiviti 具体的任务委托行为类都放在org.activiti.engine.impl.bpmn.behavior包中。 下面为部分的委托类图,如图: 本篇主要介绍pvm的基本结构和大体的调用关系,至于详细的调用过程,后续会从启动、审批、结束,整个流程周期为出发点详细解读。 |
|
来自: 贾朋亮博客 > 《Activiti研究》