Activiti 核心对象按时期源码结构分析

2017-06-25 20:50:19

请关注唯心的个人微信公众号:craft6-cn(中划线,也可以搜索:领域驱动业务建模)

Activiti 核心对象按时期源码结构分析

作者 | 颜超敏

网站:craft6.cn。公众号:craft6-cn



1

ACTIVITI的对象时期划分

ACTIVITI 对象很多,有些对象命名很相近 ,对于理解其源码和具体实现逻辑会造成困扰。比如:

  • Activity 和 ActivityImpl对象

  • Task和TaskEntity

  • ExecutionEntity和ExecutionImpl 

 等等。

命名类似,加上Activiti使用了大量的设计模式,代码引用层次非常深,让人阅读代码时容易混乱。


所以将ACTIVITI的对象按生命时期划分则容易区分,逐个时期理解,降低阅读难度。


我将ACTIVITI分为 3 个周期来划分:

  • 模型期
    流程设计完成后,会产生一个xml流程设计文件,Activiti通过流程配置对象实例化BpmnParseHandler集合,完成xml解析到模型期对象。

  • 部署期

    部署期主要对象为ProcessDefinitionEntity,通过RepositoryService来部署。

  • 运行期
    主要通过RuntimeService和TaskService来实现流程实例、分支、任务对象的创建和执行。

  • 历史期
    通过HistoryService查询历史信息。




2

模型期对象:Activity和Task


  • Activity的定义

   Activity是对应流程XML定义的所有元素的抽象父类,即Bpmn.xml中的各种元素(包括任务、网关、子流程等),流程定义基于Actitity的子类来完成整个流程定义的构造。


  • Activity和ActivityImpl的区别

    Acitity对应的流程元素的定义,是定义期对象。

ActitityImpl是流程实例运行期间具体活动的实例对象,是运行期对象。    


=======================

Actitity的类结构图:

模型期 - Activity(craft6.cn).jpg

  • 包路径:org.activiti.bpmn.model 明确说明该对象是划分为模型类对象。

  • Actitity是处在中间关键位置的抽象类。

  • 继承了:FlowNode -->FlowElement -->BaseElement,FlowNode  定义了活动进入流和出口流;FlowElement定义了监听器;BaseElement定义了扩展属性和扩展元素等。

  • 聚合了:DataAssociation 和 BoundaryEvent 。

  • 子类(最关键的):三大子类,Task(任务)、SubProcess(内部子流程)、CallActivity(外部活动,一般为外部子流程)


学习Activity对象,主要了解它的上面和下面的层次结构。


=======================

Task的类结构图:

模型期 - Task(craft6.cn).jpg

    Task是一个Actitity的空的抽象子类,但是Activiti支持的所有任务类型均是它的子类或孙子类。

    注意,在Activiti中有两个Task类,一个是model包下的抽象类,是模型期的;一个是task包下的Task接口,是运行期的。





3

部署期对象:ProcessDefinitionEntity

ProcessDefinitionEntity的类结构图:

模型期 - ProcessDefinitionEntity(craft6.cn).jpg

图比较大,主要是要把关键的对象都纳入进来。


  • ProcessDefinitionEntity的父类ProcessDefinitionImpl聚合了ActivityImpl初始化活动和集合活动。

  • 继承ScopeImpl:聚合了ExecutionListener,这是Activiti的事件扩展点。

  • Pvm抽象基础类:PvmProcessDefinition --> ReadOnlyProcessDefinition -->PvmScope-->PvmProcessElement。PVM主要就是负责流程整个运行期的执行、流转等所有运行过程。关于PVM值得专门撰写,对于Activiti的深入个性化扩展(比如驳回、跳转、分发汇总等)都会直接处理Pvm对象。

  • 聚合了TaskDefinition:TaskDefinition是基于Task对象解析获得的,可以参考UserTaskParseHandler代码。

  • 实现了PersistentObject、HasRevision:表示它是持久化的,并且有版本控制。





4

运行期对象:TaskEntity、ActivityImpl、ExecutionEntity和ExecutionImpl


  • TaskEntity:任务对象,实现Task接口。TaskService服务操作的对象。

  • ActivityImpl:PvmActivity的实现类,对Acitivity进行扩展开发务必关键学习好的类。【重要】

  • ExecutionEntity:流程实例接口的实现类

  • ExecutionImpl:ExecutionEntity实例的实际实现,虽然ExecutionEntity是通过RuntimeServiceImpl实现的,但是经过一连串处理,实际是由ExecutionImpl实现的。


=======================

TaskEntity类结构图:

运行期 - TaskEntity(craft6.cn).jpg


=======================

ActivityImpl类结构图:

运行期 - ActivityImpl(craft6.cn).jpg

ActivityImpl在整个Activiti对象中最为复杂,也最为核心,我们对Activiti进行的本土化扩展都是围绕该对象进行操作的,比如驳回、任意驳回、分发、汇总等复杂的业务处理,均是通过对它进行编程实现的。


=======================

ExecutionEntity和ExecutionImpl类结构图:

运行期 - ExecutionEntity 和 ExecutionImpl(craft6.cn).jpg


两者并没有关联关系,可以认为ExecutionEntity是实体类,ExecutionImpl是业务实现类。


查看其关系可以通过阅读代码:

RuntimeServiceImpl.startProcessInstanceByKey

StartProcessInstanceCmd.execute

ProcessDefinitionEntity.createProcessInstance

ProcessDefinitionImpl.createProcessInstanceForInitial

ProcessDefinitionImpl.newProcessInstance


最后到达的代码:

protected InterpretableExecution newProcessInstance(ActivityImpl startActivity) {

    return new ExecutionImpl(startActivity);

  }



5

历史期对象:HistoricActivityInstanceEntity


历史期对象相比前面几个时期对象简单得多了,我们主要搞清楚三个方面即可:


  • 结构

    类图如下:

    历史数据 - HistoricActivityInstanceEntity(craft6.cn).jpg

    可见很简单,对象实体记录了活动id、执行id、任务id、执行人、外部流程实例id、租户id(针对saas)

  • 生成:就是流程历史在那里生成的? 查看代码:DefaultHistoryManager.recordActivityStart。在ActivityInstanceStartHandler中执行,通过监听器(ExecutionListener)方式触发。

  • 查询:调用Activiti的HistoryService服务即可。




作 者 简 介


    唯心,颜超敏。 专注Java开源技术和电商、CRM、工作流系统分析、业务建模。

    个人网站:www.craft6.cn

    本文原创,转载请注明出处。








可通过扫描左侧二维码阅读本文。本站文章均为颜超敏原创,欢迎转载,请注明出处即可,转载可通过下面的社会化工具快速完成。

分享到:


为您推荐这些文章,如果感兴趣,请继续阅读吧:

Activiti 核心对象按时期源码结构分析

activiti,核心对象,时期,模型期、部署期、运行期和历史期

本文将Activiti的核心对象按4个周期:模型期、部署期、运行期和历史期 进行划分,并逐一分析说明,方便阅读ACT源码深入理解。

颜超敏,唯心六艺,Craft6.cn,电子商务博客,电子商务研发,电商研发,电子商务研究,电商研究,电子商务专家,电商专家,电子商务知识,电商知识,电子商务教程,电商教程,电子商务模式,电子商务平台,电子商务商业模式,电子商务数据库设计,电商数据库设计,电子商务系统分析,Java架构设计,Java软件架构,B2C,O2O,o2o模式,o2o电子商务,o2o电子商务平台,中国电子商务,电子商务平台建设方案
粤ICP备14060523号 Copyright @2014 -唯心六艺软件