Activiti-5.3工作流引擎-源码解析(流程文档解析)
前面我们通过BPMN20.xsd和Activiti自定义的XML Schema文件初步了解了业务流程模型的定义,那么现在我们来了解一下流程文档的解析过程,这个过程主要是通过代码解析来完成。
代码解析过程
就代码解析还是承接《业务流程部署》一篇的“代码10”的片段来说吧。在解析之前我们先来看看Activiti5.3的微内核类图结构
图1
(一)解析StartEvents
根据“代码10”的代码片段,我们先看parseStartEvents(scopeElement, parentScope)的解析过程,该解析过程主要是创建startEventActivity实例,并将其放入流程定义processDefinition内。
parseStartEvents执行的主要过程:
- 解析并创建startEventActivity实例。
- 设置流程定义的初始化节点。
- 解析并创建startFormHandler实例。
- 设置流程定义的startFormHandler。
- 解析Activiti-5.2扩展的initiator属性,并将其设置到流程定义的属性列表里。
- 为startEventActivity设置活动行为执行器(NoneStartEventActivityBehavior)。
上面提到了活动行为执行器,活动行为执行器的作用主要是执行流程转移的。这里我们查看一下activiti5.3流程引擎中的活动行为执行器的类结构图
图2
图3
图4
图5
图6
从图2-图6我们可以看出活动行为执行器的类结构及其相互关系。
(二)解析Activities
现在我们再看parseActivities(scopeElement,parentScope)的解析过程,该解析过程主要解析exclusiveGateway、 parallelGateway、scriptTask、serviceTask、businessRuleTask、task、manualTask、userTask、sendTask、receiveTask、subProcess、callActivity。现在我们一次看上面各种节点的解析过程。
parseExclusiveGateway执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 为activity对象设置活动行为执行器(ExclusiveGatewayActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseParallelGateway执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 为activity对象设置活动行为执行器(ParallelGatewayActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseScriptTask执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 获取子元素script及其文本内容,获取scriptFormat属性值,默认为juel,获取resultVariable属性值,这步主要是为第3步做准备。
- 为activity对象设置活动行为执行器(ScriptTaskActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseServiceTask执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 分别获取元素属性type、class、expression、delegateExpression、resultVariable、implementation、operationRef的值。
- 为activity对象设置活动行为执行器(ScriptTaskActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseBusinessRuleTask执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 初始化BusinessRuleTaskActivityBehavior实例ruleActivity并为其设置相关属性。
- 为activity对象设置活动行为执行器(BusinessRuleTaskActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseTask执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 为activity对象设置活动行为执行器(TaskActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseManualTask执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 为activity对象设置活动行为执行器(ManualTaskActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseUserTask执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 初始化UserTaskActivityBehavior实例userTaskActivity并为其设置相关属性。
- 为activity对象设置活动行为执行器(UserTaskActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseSendTask执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 为activity对象设置活动行为执行器(WebServiceActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseReceiveTask执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 为activity对象设置活动行为执行器(ReceiveTaskActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseSubProcess执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 为activity对象设置活动行为执行器(SubProcessActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseCallActivity执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 初始化CallActivityBehavior实例callActivityBehaviour并为其设置相关属性。
- 为activity对象设置活动行为执行器(CallActivityBehavior)。
- 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。
parseIntermediateCatchEvent执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 为activity对象设置活动行为执行器(IntermediateCatchEventActivitiBehaviour)。
(三)解析EndEvents
parseEndEvents执行的主要过程:
- 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
- 为activity对象设置活动行为执行器(NoneEndEventActivityBehavior)。
(四)解析BoundaryEvents
(五)解析SequenceFlow
(六)解析ExecutionListeners
Activiti-5.3工作流引擎-源码解析(流程文档解析)的更多相关文章
- quartz.net任务调度:源码及使用文档
目录: 1.quartz.net任务调度:源码及使用文档 2.quartz.net插件类库封装 前言 前段时间把自己封装quartz.net 类库的过程总结到博客园,有网友想要看一下源码,所以就把源码 ...
- 在MyEclipse显示struts2源码和doc文档及自动完成功能
分类: struts2 2010-01-07 16:34 1498人阅读 评论(1) 收藏 举报 myeclipsestruts文档xmlfileurl 在MyEclipse显示struts2源码和d ...
- eclipse导入java和android sdk源码,帮助文档
eclipse导入java和android sdk源码,帮助文档 http://blog.csdn.net/ashelyhss/article/details/37993261 JavaDoc集成到E ...
- 【C#附源码】数据库文档生成工具支持(Excel+Html)
[2015] 很多时候,我们在生成数据库文档时,使用某些工具,可效果总不理想,不是内容不详细,就是表现效果一般般.很多还是word.html的.看着真是别扭.本人习惯用Excel,所以闲暇时,就简单的 ...
- MyEclipse10查看Struts2源码及Javadoc文档
1:查看Struts2源码 (1):Referenced Libraries >struts2-core-2.1.6.jar>右击>properties. (2):Java Sour ...
- Mahout源码分析之 -- 文档向量化TF-IDF
fesh个人实践,欢迎经验交流!Blog地址:http://www.cnblogs.com/fesh/p/3775429.html Mahout之SparseVectorsFromSequenceFi ...
- MyEclipse查看Struts2源码及Javadoc文档
一.查看Struts2源码 1.Referenced Libraries >struts2-core-2.1.6.jar>右击>properties. 2.Java Source A ...
- 【C#附源码】数据库文档生成工具支持(Excel+Htm)
数据库文档生成工具是用C#开发的基于NPOI组件的小工具.软件源码大小不到10MB.支持生成Excel 和Html 两种文档形式.了解更多,请访问:http://www.oschina.net/cod ...
- 基于SpringBoot的药店管理系统java药房管理系统(源码+数据库文件+文档)
注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SpringBoot 前端技术:HTML+CSS+JavaScript+Bootstrap+jQue ...
随机推荐
- 阿里云服务器ECS部署应用教程
购买阿里云服务器 大多数云服务器默认安装的语言运行环境版本都很旧了,python用的还是2.7,JDK用的还是1.6的,在ECS云服务器中可以自行安装,包括python3.4之类的. 在次页面购买EC ...
- 2019_京东JAVA实习生招聘机试第一题
题意抽象出来就是,求根节点的所有子节点中,以这些子节点为根的子树的最大节点数. 已有向图的方式来保存无向图,所以叶子结点i的eage[i].size()==1. import java.util.Ar ...
- Android(java)学习笔记179:多媒体之加载大图片到内存(Bitmap API)
1. Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度, ...
- DB9串口引脚定义
在单片机串口通信中,使用3根信号线就能够实现通信:RXD,TXD,GND. 经常使用的RS232串口线使用DB9端子. DB9分为公头和母头两种: 一般使用时,引脚定义如下: 连接方式: 注:RXD- ...
- 一次执行两个npm "start": "concurrently 'npm:dev' 'npm:json-server'"
用的这个程序 concurrently 说是再有异步的时候,&& 就不好使,而且&& 也不能执行npm 只能执行命令 官方地址:https://www.npmjs.co ...
- CAD交互绘制带颜色宽度的直线(网页版)
用户可以在CAD控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE ...
- ES6对象和数组解构
解构可以避免在对象赋值时再生成多余的中间变量: function foo() { return [1,2,3]; } let arr = foo(); // [1,2,3] let [a, b, c] ...
- python读取绝对路径的三种方式
import pandas as pd dood_inf0=pd.read_csv("C:\\Users\\Administrator\\Desktop\\food_info.csv&quo ...
- jQuery判断一个元素是否为另一个元素的子元素(或者其本身)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head& ...
- 字典(trie)树--从入门到入土
今天再来认识一个强大的数据结构. 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词 ...