zoukankan      html  css  js  c++  java
  • Activiti-5.3工作流引擎-源码解析(流程文档解析)

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

    代码解析过程

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

    Activiti-5.3工作流引擎-源码解析(流程文档解析) - homeland520 - 好好学习,天天向上

    图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流程引擎中的活动行为执行器的类结构图 

    Activiti-5.3工作流引擎-源码解析(流程文档解析) - homeland520 - 好好学习,天天向上

     

    图2

    Activiti-5.3工作流引擎-源码解析(流程文档解析) - homeland520 - 好好学习,天天向上

     图3

    Activiti-5.3工作流引擎-源码解析(流程文档解析) - homeland520 - 好好学习,天天向上

    图4

    Activiti-5.3工作流引擎-源码解析(流程文档解析) - homeland520 - 好好学习,天天向上

     图5

    Activiti-5.3工作流引擎-源码解析(流程文档解析) - homeland520 - 好好学习,天天向上

     图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

  • 相关阅读:
    归并排序模板
    树状数组模板
    KMP模板
    拓扑排序模板
    分布式唯一ID生成算法-雪花算法
    【转载】一起来学Spring Cloud | Eureka Client注册到Eureka Server的秘密
    一起来学Spring Cloud | 第八章:消息总线(Spring Cloud Bus)
    我为什么会成为一个程序猿
    一起来学Spring Cloud | 第七章:分布式配置中心(Spring Cloud Config)
    一起来学Spring Cloud | 第六章:服务网关 ( Zuul)
  • 原文地址:https://www.cnblogs.com/haore147/p/5213561.html
Copyright © 2011-2022 走看看