前面我们通过BPMN20.xsd和Activiti自定义的XML Schema文件初步了解了业务流程模型的定义,那么现在我们来了解一下流程文档的解析过程,这个过程主要是通过代码解析来完成。

代码解析过程

就代码解析还是承接《业务流程部署》一篇的“代码10”的片段来说吧。在解析之前我们先来看看Activiti5.3的微内核类图结构

图1

(一)解析StartEvents

根据“代码10”的代码片段,我们先看parseStartEvents(scopeElement, parentScope)的解析过程,该解析过程主要是创建startEventActivity实例,并将其放入流程定义processDefinition内。

parseStartEvents执行的主要过程:

    1. 解析并创建startEventActivity实例。
    2. 设置流程定义的初始化节点。
    3. 解析并创建startFormHandler实例。
    4. 设置流程定义的startFormHandler。
    5. 解析Activiti-5.2扩展的initiator属性,并将其设置到流程定义的属性列表里。
    6. 为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执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 为activity对象设置活动行为执行器(ExclusiveGatewayActivityBehavior)。
  3. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseParallelGateway执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 为activity对象设置活动行为执行器(ParallelGatewayActivityBehavior)。
  3. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseScriptTask执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 获取子元素script及其文本内容,获取scriptFormat属性值,默认为juel,获取resultVariable属性值,这步主要是为第3步做准备。
  3. 为activity对象设置活动行为执行器(ScriptTaskActivityBehavior)。
  4. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseServiceTask执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 分别获取元素属性type、class、expression、delegateExpression、resultVariable、implementation、operationRef的值。
  3. 为activity对象设置活动行为执行器(ScriptTaskActivityBehavior)。
  4. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseBusinessRuleTask执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 初始化BusinessRuleTaskActivityBehavior实例ruleActivity并为其设置相关属性。
  3. 为activity对象设置活动行为执行器(BusinessRuleTaskActivityBehavior)。
  4. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseTask执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 为activity对象设置活动行为执行器(TaskActivityBehavior)。
  3. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseManualTask执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 为activity对象设置活动行为执行器(ManualTaskActivityBehavior)。
  3. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseUserTask执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 初始化UserTaskActivityBehavior实例userTaskActivity并为其设置相关属性。
  3. 为activity对象设置活动行为执行器(UserTaskActivityBehavior)。
  4. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseSendTask执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 为activity对象设置活动行为执行器(WebServiceActivityBehavior)。
  3. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseReceiveTask执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 为activity对象设置活动行为执行器(ReceiveTaskActivityBehavior)。
  3. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseSubProcess执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 为activity对象设置活动行为执行器(SubProcessActivityBehavior)。
  3. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseCallActivity执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 初始化CallActivityBehavior实例callActivityBehaviour并为其设置相关属性。
  3. 为activity对象设置活动行为执行器(CallActivityBehavior)。
  4. 解析并创建ExecutionListener的实例,同时将其设置到actvity实例内。

parseIntermediateCatchEvent执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 为activity对象设置活动行为执行器(IntermediateCatchEventActivitiBehaviour)。

(三)解析EndEvents

parseEndEvents执行的主要过程:

  1. 解析并创建ActivityImpl实例activity,创建的过程中主要依赖的属性是“id”,该属性在所有的Activity中不允许重复。
  2. 为activity对象设置活动行为执行器(NoneEndEventActivityBehavior)。

(四)解析BoundaryEvents

(五)解析SequenceFlow

(六)解析ExecutionListeners

Activiti-5.3工作流引擎-源码解析(流程文档解析)的更多相关文章

  1. quartz.net任务调度:源码及使用文档

    目录: 1.quartz.net任务调度:源码及使用文档 2.quartz.net插件类库封装 前言 前段时间把自己封装quartz.net 类库的过程总结到博客园,有网友想要看一下源码,所以就把源码 ...

  2. 在MyEclipse显示struts2源码和doc文档及自动完成功能

    分类: struts2 2010-01-07 16:34 1498人阅读 评论(1) 收藏 举报 myeclipsestruts文档xmlfileurl 在MyEclipse显示struts2源码和d ...

  3. eclipse导入java和android sdk源码,帮助文档

    eclipse导入java和android sdk源码,帮助文档 http://blog.csdn.net/ashelyhss/article/details/37993261 JavaDoc集成到E ...

  4. 【C#附源码】数据库文档生成工具支持(Excel+Html)

    [2015] 很多时候,我们在生成数据库文档时,使用某些工具,可效果总不理想,不是内容不详细,就是表现效果一般般.很多还是word.html的.看着真是别扭.本人习惯用Excel,所以闲暇时,就简单的 ...

  5. MyEclipse10查看Struts2源码及Javadoc文档

    1:查看Struts2源码 (1):Referenced Libraries >struts2-core-2.1.6.jar>右击>properties. (2):Java Sour ...

  6. Mahout源码分析之 -- 文档向量化TF-IDF

    fesh个人实践,欢迎经验交流!Blog地址:http://www.cnblogs.com/fesh/p/3775429.html Mahout之SparseVectorsFromSequenceFi ...

  7. MyEclipse查看Struts2源码及Javadoc文档

    一.查看Struts2源码 1.Referenced Libraries >struts2-core-2.1.6.jar>右击>properties. 2.Java Source A ...

  8. 【C#附源码】数据库文档生成工具支持(Excel+Htm)

    数据库文档生成工具是用C#开发的基于NPOI组件的小工具.软件源码大小不到10MB.支持生成Excel 和Html 两种文档形式.了解更多,请访问:http://www.oschina.net/cod ...

  9. 基于SpringBoot的药店管理系统java药房管理系统(源码+数据库文件+文档)

    注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SpringBoot 前端技术:HTML+CSS+JavaScript+Bootstrap+jQue ...

随机推荐

  1. VINS-Fusion代码阅读(四)

    pts_i和pts_j:具体指什么含义?(分别为第l个路标点在第i, j个相机归一化相机坐标系中的观察到的坐标,P¯¯¯cil \bar{P}^{c_i}_l Pˉ lc i​ ​ 和 P¯¯¯cjl ...

  2. postman的关联,即如何在请求中引用上次请求返回的值

    做接口测试,一定会遇到这种情况,需要拿上次请求的值在本次请求中使用,比如,我们去测试一个东西,要去登录才能做其他的操作,需要拿到登录返回数据中的某些字段,比如,token啊等... 如果发一次请求,就 ...

  3. js数字转金额,ajax调用接口,后台返回html(完整页面),打开新窗口并写入html

    一.转换成金额形式 function toMoney(num){ if(num){ if(isNaN(num)) { alert("金额中含有不能识别的字符"); return; ...

  4. 阿里云首次安装和部署nginx

    1.执行yum命令安装依赖 yum -y install pcre* yum -y install openssl* 2.下载nginx //如果没有安装wget,下载已编译版本 yum instal ...

  5. Eclipse Code Recommenders 自动补全(联想)神器

    Eclipse Code Recommenders 可以在eclipse市场中下载.自动补全.模糊匹配.非常有用!

  6. js实现返回上一页功能

    大家在做 "返回上一页" 这个功能的时候 都是用history.go(-1);来实现的 但这段代码只是简单的使用浏览器的后退功能 从浏览器缓存中取出页面来显示 但我们绝大部分情况都 ...

  7. 数独(深搜)(poj2726,poj3074)

    数独(深搜)数据最弱版本(poj 2676) Description Sudoku is a very simple task. A square table with 9 rows and 9 co ...

  8. Go:文件操作

    一.打开文件和关闭文件 os包File结构体的两个方法: func Open(name string) (file *File, err error) Open打开一个文件用于读取.如果操作成功,返回 ...

  9. css 实践记录

    子绝父相 https://developer.mozilla.org/zh-CN/docs/Web/CSS/position 利用子绝父相来实现一种比较老的居中方式:1.明确宽度:2.定位左边到容器的 ...

  10. git 知识(转)

    转自:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html Workspace:工作区 Index / Stage:暂存区 Repos ...