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、 把已完毕的流程做数据清理并备份
Activiti源代码分析的更多相关文章
- Activiti 流程启动及节点流转源代码分析
作者:jiankunking 出处:http://blog.csdn.net/jiankunking 本文主要是以activiti-study中的xiaomage.xml流程图为例进行跟踪分析 详细的 ...
- Activiti架构分析及源码详解
目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...
- android-plugmgr源代码分析
android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...
- Twitter Storm源代码分析之ZooKeeper中的目录结构
徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...
- 转:SDL2源代码分析
1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...
- 转:RTMPDump源代码分析
0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...
- 转:ffdshow 源代码分析
ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...
- UiAutomator源代码分析之UiAutomatorBridge框架
上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...
- MyBatis架构设计及源代码分析系列(一):MyBatis架构
如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...
随机推荐
- Java实现归并排序和快速排序
参考http://blog.csdn.net/morewindows/article/details/6684558和http://developer.51cto.com/art/201206/344 ...
- 【Win 10 应用开发】UI Composition 札记(八):用 XamlLight 制作灯光效果
前面老周已介绍过灯光的使用,如果你忘了,请用九牛二虎之力猛点击这里去复习一下.本篇老周再介绍另一种添加灯光的方法,这种方法是专为 XAML 元素而设计的,可以很方便地为可视化元素添加灯光效果. 不知道 ...
- centos6.7安装openblas错误
centos系统:CentOS release 6.7 (Final)安装OpenBLAS # Install OpenBLAS at /usr/local/openblas git clone ht ...
- Linq学习系列-----1.2 一个简单方法的改进思考及不同的执行形式
一.普通模式: #region 模式1 public Form1() { InitializeComponent(); GetProcessByJudge(); } public bool Memor ...
- C++ UTF8和GB2312相互转换
#include <Windows.h> #include <string> using std::string; void UTF8_to_GB2312(const char ...
- GacUtil
编辑本段工具简介 全局程序集缓存工具 (Gacutil.exe) 管理程序集缓存的 .NET 实用工具库还提供一种命令行接口工具,名为全局程序集缓存实用工具 (Gacutil.exe). 编辑本段命令 ...
- JavaScript(五):函数(闭包,eval)
1.函数的申明:三种方法: function命令 函数表达式:变量赋值 Function构造函数 //method 1: function命令 function test(){ console.log ...
- jsp加java连接数据库,进行信息输入,并进行初步的拦截判断。
图形大概这样 按照图片要求设计添加新课程界面.(0.5分) 在后台数据库中建立相应的表结构存储课程信息.(0.5分) 实现新课程添加的功能. 要求判断任课教师为王建民.刘立嘉.刘丹.王辉.杨子光五位教 ...
- 小白关于python 对象和内存的关系的一些感悟和疑惑,望大神指教
首先你输入了一个字符串,这个字符串是有大小的,电脑将其放在内存中,自动给其一个起始指针指向这个字符串的首位置,然后,你将这个字符串赋值给一个变量,这个对象又在内存中开辟出一个空间,这个变量会自动连接这 ...
- 【MySQL疑难杂症】如何将树形结构存储在数据库中(方案一、Adjacency List)
今天来看看一个比较头疼的问题,如何在数据库中存储树形结构呢? 像mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这样有深度的人,就很难驾驭了. 举个栗子:现在有一 ...