zoukankan      html  css  js  c++  java
  • Activiti源代码分析

    ExecutionEntity内部含有parent,是一个运行树或运行路径。应该是一个流程实例的运行过程,一个实例相应一个ExecutionEntity,通过getActivity得到的是当前正在运行的activity.

    Activiti之流程部署:

    流程文件部署主要涉及到3个表。各自是:ACT_GE_BYTEARRAY、ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF。

    主要完毕“部署包”–>“流程定义文件”–>“全部包内文件”的解析部署关系
    流程定义的部署须要完毕例如以下操作: 
    1、初始化到数据库,完毕三张表的插入,一个部署包里能够有N个流程定义。所以 PROCDEF表内相应N条数据,BYTEARRAY表内相应N+条记录。每一个xml文件一条记录。图片也会另外存放一条记录。DEPLOYMENT内会存放一条记录 
    2、解析后的流程定义存入DeploymentCache
    流程部署的序列图:
    这里写图片描写叙述
    流程部署已后,启动流程时,会调用StartProcessInstanceCmd。来启动流程。

    StartProcessInstanceCmd在查找ProcessDefinitionEntity时,会从deploymentCache中查找,当cache中不存在时。会运行deploymentCache.deploy() 。

    Activiti之Query查询:

    缓存查询:

    这里写图片描写叙述

    Activiti之manager:

    这里写图片描写叙述

    创建流程实例:

    创建流程实例:

    runtimeService.startProcessInstanceByKey("financialReport") 

    运行步骤:
    1、 首先依据” financialReport”在数据库中查找流程定义
    2、 查找到流程定义后,再从processDefinitionCache中获取已经缓存的、部署完毕的(xml 文件被解析的)流程定义,假设processDefinitionCache中不存在。那么运行流程的解析过程
    3、 创建流程实例
    代码运行过程:
    ①AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationProcessStart
    ②AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationProcessStartInitial
    ③AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute
    ④ProcessInstance[805] executes Activity(theStart):
    org.activiti.engine.impl.bpmn.behavior.NoneStartEventActivityBehavior
    ⑤Leaving activity ‘theStart’

    流程启动:

    流程启动运行:

    ExecutionEntity.performOperation(AtomicOperation.PROCESS_START) 

    接着运行:execution.performOperation(PROCESS_START_INITIAL);
    接着运行:execution.performOperation(ACTIVITY_EXECUTE);
    其内部运行逻辑为:
    ActivityBehavior activityBehavior = activity.getActivityBehavior();
    activityBehavior.execute(execution);
    activityBehavior有非常多的实现类。比方:当流程启动时,启动节点的activityBehavior实际上是NoneStartEventActivityBehavior的实例。给每一个节点装配ActivityBehavior应该是在流程解析时完毕的。一个类型的节点装配特定类型的Behavior。固定写死的。

    Activiti之数据操作

    Insert、update、delete三种操作,先更新cache,在一个cmd中。把全部须要insert的数据放入一个map,运行完cmd后,统一进行insert、update、delete操作
    每一个Service的“命令运行者”都是由:
    “LogInterceptor–>CommandContextInterceptor–>CommandExecutorImpl”组成的运行链状结构。
    日志—>运行前后操作(比方:transaction的开启及commit)运行命令

    Activiti之任务分配

    任务分配时,依据流程定义。首先依据人工活动定义的Assignee,直接进行分配,假设 Assignee有值,此时该任务处于已认领状态。然后继续运行任务的候选人分配,候选人分两种:候选组表达式及候选人表达式,解析表达式。进行公共任务分配。

    任务应该没有状态,标记是已经被认领时,是依据该任务的属性:task.getAssignee()是否有值进行推断。

    Activiti之任务认领

    1、没有找到推断是否有权限进行认领操作
    2、 假设该任务属性:task.getAssignee()有值。说明已经被认领,假设和当前认领人不同, 抛出异常,is already claimed by someone else
    运行认领操作,数据库操作步骤(分别相应三张表):
    ⑴、update HistoricActivityInstanceEntity
    ⑵、update HistoricTaskInstanceEntity
    ⑶、update TaskEntity

    Activiti之任务完毕

    在创建一个新人工任务时。在数据表IdentityLinkEntity中删除当前已完毕的这条数据,当流程实例结束时。删除execution表中的当前流程数据。


    完毕一个人工任务时。完毕的数据库表操作:
    1. insert HistoricActivityInstanceEntity
    2. insert TaskEntity
    3. insert HistoricTaskInstanceEntity
    4. insert IdentityLinkEntity
    5. update ExecutionEntity
    6. update HistoricActivityInstanceEntity
    7. update HistoricTaskInstanceEntity
    8. delete IdentityLinkEntity
    9. delete TaskEntity
    完毕任务时,走的过程:
    1.Leaving activity
    ‘writeReportTask’ [org.activiti.engine.impl.bpmn.behavior.BpmnActivityBehavior]
    2.AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerEnd
    3.AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerEnd@1c09624
    4.AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionDestroyScope
    5.AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerTake
    6.ProcessInstance[605] takes transition
    (writeReportTask)–flow2–>(verifyReportTask) [org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerTake]
    7.AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionCreateScope
    8. AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerStart
    9.AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerStart
    10. AtomicOperation:
    org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute@1478a2don org.activiti.engine.impl.interceptor.CommandContext
    11. ProcessInstance[605] executes Activity(verifyReportTask):
    org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior

    Activiti其他

    Activiti之executionEntity:
    这里写图片描写叙述
    这里写图片描写叙述

    Activiti之定义模型:

    这里写图片描写叙述

    Activiti之优缺点:

    1、 一直没能理解它的executionEntity的模型,它提供了三个接口:pvmexecution、execution、 activityExecution,是它的名字起的不好还是有其他的思想?
    2、 当流程结束时。删除相应的记录。这样的操作非常巧妙的支持了集群环境
    3、 见识了把一个流程从開始到结束的抽象:分解成各种cmd和AtomicOperation
    4、 通过一个运行链完毕transaction的编程式事物控制
    5、 不支持组织机构的扩展,与业务系统进行集成时,要写非常多的event来完毕任务分配
    6、 能够记录冗余业务数据来组合查询任务
    7、 把已完毕的流程做数据清理并备份

    原文链接

  • 相关阅读:
    [转]vim 常用命令
    C语言运算符优先级顺序
    uboot
    linux 驱动开发 不定期更新
    [转]spdk 和nvme 预备知识1
    【转】聊聊 Linux IO
    [转]NVMe协议/ SSD控制器/ linux driver / open channel
    Ubuntu给应用程序创建一个启动图标
    Qt4.8.7+mingw4.8.2 环境搭建
    更改C编译器的缺省字节对齐方式__align(),__attribute((aligned (n))),#pragma pack(n)
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7267259.html
Copyright © 2011-2022 走看看