您当前的位置: 首页 > 

衣舞晨风

暂无认证

  • 0浏览

    0关注

    1156博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Activiti源码分析

衣舞晨风 发布时间:2016-04-06 19:41:31 ,浏览量:0

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

原文链接

关注
打赏
1647422595
查看更多评论
立即登录/注册

微信扫码登录

0.1968s