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、 把已完毕的流程做数据清理并备份

url=n62CHc2M_1GymWDLpbygTHe1Di79r9Wk-oLEgCkmkGsNlgD-MNjlwVKYaCxY2byHQkaIaSJYBw_S_GzFHt1pdaWO-Wg39Yb0Yl33lga_7M3">原文链接

Activiti源代码分析的更多相关文章

  1. Activiti 流程启动及节点流转源代码分析

    作者:jiankunking 出处:http://blog.csdn.net/jiankunking 本文主要是以activiti-study中的xiaomage.xml流程图为例进行跟踪分析 详细的 ...

  2. Activiti架构分析及源码详解

    目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...

  3. android-plugmgr源代码分析

    android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...

  4. Twitter Storm源代码分析之ZooKeeper中的目录结构

    徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...

  5. 转:SDL2源代码分析

    1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...

  6. 转:RTMPDump源代码分析

    0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...

  7. 转:ffdshow 源代码分析

    ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...

  8. UiAutomator源代码分析之UiAutomatorBridge框架

    上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...

  9. MyBatis架构设计及源代码分析系列(一):MyBatis架构

    如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...

随机推荐

  1. Flex中宽度计算

    flex 有三个属性值,分别是 flex-grow, flex-shrink, flex-basis,默认值是 0 1 auto. 发现网上详细介绍他们的文章比较少, 今天就详细说说他们,先一个一个看 ...

  2. linux环境手动编译安装Nginx实践过程 附异常解决

    1.下载nginx源码包并解压 可在http://nginx.org/en/download.html下载.tar.gz的源码包,如(nginx-1.4.7.tar.gz) 或者使用云盘下载   ht ...

  3. Scrum Meeting Alpha - 8

    Scrum Meeting Alpha - 8 NewTeam 2017/11/2 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 完成了登录API的测试和包装Pull Requ ...

  4. java三大框架项目和Redis组合使用

    已知一个已有的Struts+Spring+Hibernate项目,以前使用MySQL数据库,现在想把Redis也整合进去.1. 相关Jar文件 下载并导入以下3个Jar文件: commons-pool ...

  5. Windows常用shell命令大全

    Windows常用shell命令大全 基于鼠标操作的后果就是OS界面外观发生改变, 就得多花学习成本.更主要的是基于界面引导Path与命令行直达速度是难以比拟的.另外Geek很大一部分是键盘控,而非鼠 ...

  6. 通过两个小栗子来说说Java的sleep、wait、notify、notifyAll的用法

    线程是计算程序运行的最小载体,由于单个单核CPU的硬件水平发展到了一定的瓶颈期,因此就出现了多核多CPU的情况,直接就导致程序员多线程编程的复杂.由此可见线程对于高性能开发的重要性. 那么线程在计算机 ...

  7. ImageMagick图片服务器

    1.前置准备工具如下: nodejs express(nodejs mvc框架) body-parser(express middleware) gm(nodejs中用来处理图片的) uuid(nod ...

  8. [转载] zookeeper 分布式锁服务

    转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...

  9. 从零一起学Spring Boot之LayIM项目长成记(五)websocket

    前言 距离上一篇已经比较久的时间了,项目也是开了个头.并且,由于网上的关于Spring Boot的websocket讲解也比较多.于是我采用了另外的一个通讯框架 t-io 来实现LayIM中的通讯功能 ...

  10. jquery.form.js+jquery.validation.js实现表单校验和提交

      一.jquery引用 主要用到3个js: jquery.js jquery.form.js jquery.validation.js 另外,为了校验结果提示本地化,还需要引入jquery.vali ...