流程虚拟机
流程文档中的元素解析完毕之后,是不可以直接使用的,还需要对其属性承载类实例(解析结果)进行一次加工,因为流程文档中定义的事件、网关、活动(流程三大要素)等信息最终交给流程虚拟机管理,而流程虚拟机的运转机制仅依赖ActivityImpl实例对象或者TransitionImpl实例对象(连线),并非元素解析后的BaseElement实例对象。
1、流程虚拟机原理
流程模型解析为流程虚拟机对象,如下:
各个模块总结如下:
(1)定义流程文档
流程文档的定义工作完全交给客户端,客户端可以根据自己的业务需求定制流程文档,在流程文档的定义过程中客户端可以从元素仓库中获取一系列的元素组装使用,例如定义用户任务(userTask)等。该阶段所有的元素均处于XML定义阶段。
(2)元素解析层
BpmnXMLConverter类中的convertToBpmnModel方法所做的工作就是将流程文档中的元素解析并转化成Activiti中内部表示BaseElement实例,并最终使用流程BpmnModel实例进行保存(类似内存数据库),从而使所有的元素解析结果均可以通过BpmnModel实例对象进行获取,而无须再次解析流程文档,提高运行效率。元素解析工作完成之后,流程文档中的所有元素已经与activiti-bpmn-model-5.21.0.jar包中的BaseElement实例对象一一对应起来。
(3)对象解析层
bpmnParse.execute()方法的处理过程,就是将BaseElement实例对象中的属性信息解析并转化为流程虚拟机中可识别的ActivityImpl实例对象或者TransitionImpl实例对象。
接下来使用userTask节点的定义、元素解析和对象解析三个阶段来举例说明,流程文档中userTask元素经过元素解析层之后转换为UserTask实例对象,UserTask实例经过对象解析层之后蜕变为ActivityImpl实例对象,UserTask实例对象中所有信息作为ActivityImpl实例对象的属性值存在,这样后续操作可以直接通过流程虚拟机获取ActivityImpl实例对象,进而获取到任务节点的所有信息。
元素解析与对象解析两个阶段的工作完毕之后,所有的BaseElement实例对象已经与流程虚拟机中ActivityImpl实例对象对应起来。在对象解析阶段,ActivityImpl实例对象需要根据元素实体的类型填充不同的属性值,以方便流程虚拟机按照元素的类型进行区分处理,该阶段涉及的类包括但不限于流程虚拟机类ActivityImpl、任务节点实体类(TaskDefinition)和活动行为类。