Activiti源码分析
ExecutionEntity内部含有parent,是一个执行树或执行路径,应该是一个流程实例的执行过程,一个实例对应一个ExecutionEntity,通过getActivity得到的是当前正在执行的activity.
流程文件部署主要涉及到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() 。
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’
接着执行:execution.performOperation(PROCESS_START_INITIAL);
接着执行:execution.performOperation(ACTIVITY_EXECUTE);
其内部执行逻辑为:
ActivityBehavior activityBehavior = activity.getActivityBehavior();
activityBehavior.execute(execution);
activityBehavior有很多的实现类,比如:当流程启动时,启动节点的activityBehavior实际上是NoneStartEventActivityBehavior的实例。给每个节点装配ActivityBehavior应该是在流程解析时完成的,一个类型的节点装配特定类型的Behavior,固定写死的。
Insert、update、delete三种操作,先更新cache,在一个cmd中,把所有需要insert的数据放入一个map,执行完cmd后,统一进行insert、update、delete操作
每个Service的“命令执行者”都是由:
“LogInterceptor– CommandContextInterceptor– CommandExecutorImpl”组成的执行链状结构。
日志— 执行前后操作(比如:transaction的开启及commit)执行命令
任务分配时,根据流程定义,首先根据人工活动定义的Assignee,直接进行分配,如果 Assignee有值,此时该任务处于已认领状态。然后继续执行任务的候选人分配,候选人分两种:候选组表达式及候选人表达式,解析表达式,进行公共任务分配。任务应该没有状态,标记是已经被认领时,是根据该任务的属性:task.getAssignee()是否有值进行判断。
1、没有找到判断是否有权限进行认领操作
2、 如果该任务属性:task.getAssignee()有值,说明已经被认领,如果和当前认领人不同, 抛出异常,is already claimed by someone else
执行认领操作,数据库操作步骤(分别对应三张表):
⑴、update HistoricActivityInstanceEntity
⑵、update HistoricTaskInstanceEntity
⑶、update TaskEntity
在创建一个新人工任务时,在数据表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
1、 一直没能理解它的executionEntity的模型,它提供了三个接口:pvmexecution、execution、 activityExecution,是它的名字起的不好还是有其它的思想?
2、 当流程结束时,删除对应的记录,这种操作很巧妙的支持了集群环境
3、 见识了把一个流程从开始到结束的抽象:分解成各种cmd和AtomicOperation
4、 通过一个执行链完成transaction的编程式事物控制
5、 不支持组织机构的扩展,与业务系统进行集成时,要写很多的event来完成任务分配
6、 可以记录冗余业务数据来组合查询任务
7、 把已完成的流程做数据清理并备份
Activiti原理分析(一)从一个简单流程开始 本系列文章将基于 Activiti 6 源代码对 Activiti 的原理进行深入剖析,让读者快速知其然,同时知其所以然。 第一篇文章将分析一个简单流程在 Activiti 中的执行流程,借此把 Activiti 底层的一些概念快速梳理一遍,让读者对 Activiti 的底层实现有个大概了解,知晓每张表的作用。内容都是笔者从源码里分析出来或者核对过的,比一般的文档更加翔实靠谱。
相关文章
- 包机项目源码分析笔记
- ABP源码分析二十一:Feature
- I2C协议+实现源码
- CBV流程之View源码解析
- jQuery源码分析-each函数
- onCreate源码分析
- rxjava之源码分析
- Activiti 流程启动及节点流转源码分析
- Activiti源码分析
- Eclipse 如何查看jdk源码
- Activiti源码分析
- ZZNUOJ_用C语言编写程序实现1233:单词倒置(附完整源码)
- 【mybatis3】MyBatis源码分析
- ijkplayer源码分析 FrameQueue分析
- ijkplayer源码分析 start流程和buffering缓冲策略
- 【nodejs原理&源码赏析(3)】欣赏手术级的原型链加工艺术
- 鸿蒙轻内核源码分析:文件系统LittleFS
- 【Android 逆向】ART 函数抽取加壳 ① ( ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析 )
- 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )
- AI服务器环境:OpenCV++与spleeter人声音伴奏分离docker环境/源码地址
- 第二人生的源码分析(二十五)人物行走与服务器同步
- 第二人生的源码分析(七十八)LLOSInfo类实现获取操作系统信息
- 姿态估计0-09:DenseFusion(6D姿态估计)-源码解析(5)-PoseRefineNet网络与loss详解(重点篇)
- 【源码阅读】半个月读完Android系统开发源码
- HarmonyOS 编译系统源码
- 题目:JavaWeb乐购资源管理系统(附源码链接免费下载)
- 《QEMU/KVM源码分析与应用》读书笔记3 —— 第1章 QEMU与KVM概述
- android源码蓝牙协议分析
- (4)Blender源码分析之闪屏窗口显示流程