Activiti-5.3工作流引擎-源码解析(流程文档解析)
2016-02-24 16:52
423 查看
前面我们通过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
代码解析过程
就代码解析还是承接《业务流程部署》一篇的“代码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
相关文章推荐
- jmeter --- 测试计划里的元件
- String对象不可改变的特性
- 4G模块ME3760_V2 端口映射
- 安卓手机unauthorized问题解决方法
- R 中的UNICODE字符转换为中文
- QT加载office文件简单方法
- 文件高级---IO处理,文件锁,存储映射
- 23种设计模式(10):责任链模式
- C#怎么设置子窗体在主窗体中居中显示
- 初识Android的ReactiveX
- ubuntu安装lua5.3.2
- CSS常见问题及兼容性
- MS SQL 小总结
- [Java] Java反射
- bzoj 2434 [Noi2011]阿狸的打字机(fail树+离线处理+BIT)
- 各系统安装包格式
- 面试乱谈谈
- 关于根据空间中的三点如何求出抛物线方程并绘制软管
- 面试乱谈谈
- tomcat+apache集群配置