2023年8月1日发(作者:)
ExecutionEntity内部含有parent,是一个执行树或执行路径,应该是一个流程实例的执行过程,一个实例对应一个ExecutionEntity,通过getActivity得到的是当前正在执行的activity.
Activiti之流程部署:
流程文件部署主要涉及到3个表,分别是:ACT_GE_BYTEARRAY、ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF。主要完成“部署包”-->“流程定义文件”-->“所有包内文件”的解析部署关系
流程定义的部署需要完成如下操作:
初始化到数据库,完成三张表的插入,一个部署包里可以有N个流程定义,所以PROCDEF表内对应N条数据,BYTEARRAY表内对应N+条记录,每个xml文件一条记录,图片也会另外存放一条记录。DEPLOYMENT内会存放一条记录
解析后的流程定义存入DeploymentCache
流程部署的序列图:
deployrepositoryServiceDeploymentBuildercommandExecutorDeploymentManagerDbSqlSessionResourceManagerDeploymentCachecreateDeploymentdeploydeployexecute(new DeployCmd(deploymentBuilder))insertDeployment(DeploymentEntity)deploymentmanager共分三步来部署流程定义:1.0 insert(deployentity) 保存表:deployment2.0 通过一个循环,插入所有resource,保存表:bytearray3.0 deploy 保存表:procdef,deploy
方法内完成对流程定义的解析,通过sax解析xml文件得到流程定义insert(DeploymentEntity)insertResourcedeploy
流程部署已后,启动流程时,会调用StartProcessInstanceCmd,来启动流程。StartProcessInstanceCmd在查找ProcessDefinitionEntity时,会从deploymentCache中查找,当cache中不存在时,会执行()
Activiti之Query查询:
缓存查询: queryCommand+execute (CommandContext context): T+++++++升续 ()降续 ()list ()listPage ()Operation_5 ()singleResult ()count ()AbstractQuery即是一个command,又是一个查询父类,具体实现为:查询方法调用了excute方法,通过if
else判断结果类型,分发到需要子类实现的:executeCount和executeList++++++AbstractQuery升序 ()降序 ()list ()listPage ()count ()sigleResult ()TaskQuery+++++userQueryuserId ()userFirstName ()userEmail ()memberOfGroup ()orderByUserId ()...: userQuery: userQuery: userQuery: userQuery: userQueryUserQueryImplTaskQueryImpl
Activiti之manager:
session+flush ()+close ()...AbstractManager++++insert (PersistentObject record)delete (PersistentObject record)getDbSqlSession ()getManager ()mandContext().getSession(sessionClass),完成所有方法的实现。各种不同的manager主要用来实现两个方法:删除和查询。对数据库的操作,主要通过获取当前线程变量存储的数据库连接来做序列化。因为ibatis中的sqlsession是非线程安全,所以给每个线程存储一个sqlsession。ExecutionManagerTaskManager+deleteTask ()+findTask (): TaskEntity+++++deleteProcessInstances ()findProcessInstance ()findExecutions ()findChildExecutions ()findSubProcessInstance ()...: ProcessInstance: ExecutionEntity: ExecutionEntity: ExecutionEntity
创建流程实例:
创建流程实例:rocessInstanceByKey("financialReport")
执行步骤:
1.0 首先根据” financialReport”在数据库中查找流程定义
2.0 查找到流程定义后,再从processDefinitionCache中获取已经缓存的、部署完成的(xml文件被解析的)流程定义,如果processDefinitionCache中不存在,那么执行流程的解析过程 3.0 创建流程实例
代码执行过程:
1. AtomicOperation:
OperationProcessStart
2. AtomicOperation:
OperationProcessStartInitial
3. AtomicOperation:
OperationActivityExecute
4. ProcessInstance[805] executes Activity(theStart):
artEventActivityBehavior
5.
Leaving activity 'theStart'
流程启动:
流程启动执行:mOperation(S_START) ,接着执行:mOperation(PROCESS_START_INITIAL);
接着执行:mOperation(ACTIVITY_EXECUTE);其内部执行逻辑为:
ActivityBehavior activityBehavior = ivityBehavior();
e(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有值,此时该任务处于已认领状态。然后继续执行任务的候选人分配,候选人分两种:候选组表达式及候选人表达式,解析表达式,进行公共任务分配。任务应该没有状态,标记是已经被认领时,是根据该任务的属性:ignee()是否有值进行判断
Activiti之任务认领
1.0没有找到判断是否有权限进行认领操作 2.0 如果该任务属性:ignee()有值,说明已经被认领,如果和当前认领人不同,抛出异常,is already claimed by someone else
执行认领操作,数据库操作步骤(分别对应三张表):
1. update HistoricActivityInstanceEntity
2. update HistoricTaskInstanceEntity
3. 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'
[tivityBehavior]
2. AtomicOperation:
OperationTransitionNotifyListenerEnd
3. AtomicOperation:
OperationTransitionNotifyListenerEnd@1c09624
4. AtomicOperation:
OperationTransitionDestroyScope
5. AtomicOperation:
OperationTransitionNotifyListenerTake
6. ProcessInstance[605] takes transition
(writeReportTask)--flow2-->(verifyReportTask)
[OperationTransitionNotifyListenerTake]
7. AtomicOperation:
OperationTransitionCreateScope
8. AtomicOperation: OperationTransitionNotifyListenerStart
9. AtomicOperation:
OperationTransitionNotifyListenerStart
10. AtomicOperation:
OperationActivityExecute@1478a2d on dContext
11. ProcessInstance[605] executes Activity(verifyReportTask):
skActivityBehavior
Activiti其它
Activiti之executionEntity:
VariableScope++++getVariables ()setVariable ()hasVariables ()removeVariable ()...DelegateExecution++++getProcessBusinessKey ()getId ()getProcessInstanceId ()getEventName ()...ActivityExecutionPvmProcessInstanceExecutionListenerExecution+getEventName ()+getEventSource (): PvmProcessElement+getDeleteReason ()...++++++++getActivity (): PvmActivitytake (PvmTransition 入参)createExecution (): ActivityExecutioncreateSubProcessInstance ()getParent (): ActivityExecutionend ()executeActivity ()takeAll ()...+++++start ()findExecution ()findActiveActivityIds ()isEnded ()deleteCascade ()...+++++PvmExecutionsignal ()getActivity ()hasVariable ()setVariable ()getVariable ()...Execution+getId ()+isEnded ()+getProcessInstanceId ()...ProcessInstance+getProcessDefinitionId ()+getBusinessKey ()...VariableScopeImplInterpretableExecutionExecutionEntityExecutionImpl
RuntimeService++++++++startProcessInstance (): ProcessInstancedeleteProcessInstance ()getActiveActivity ()signal ()getVariables ()setVariable ()createExecutionQuery (): ExecutionQuerycreateProcessInstanceQuery (): ProcessInstanceQueryServiceImpl-executor: CommandExecutor+getCommandExecutor ()+setCommandExecutor ()RuntimeServiceImpl
Activiti之定义模型:
PvmProcessElement+getId ()+getProcessDefinition (): PvmProcessDefinition+getProperty ()...ProcessElementImplPvmScope+getActivities (): PvmActivity+findActivity (): PvmTransition+getProcessDefinition ()+getId ()+getProperty ()...ScopeImpl-activities: ActivityImpl-namedActivities: Map
Activiti之优缺点:
1.0 一直没能理解它的executionEntity的模型,它提供了三个接口:pvmexecution、execution、activityExecution,是它的名字起的不好还是有其它的思想?
2.0 当流程结束时,删除对应的记录,这种操作很巧妙的支持了集群环境
3.0 见识了把一个流程从开始到结束的抽象:分解成各种cmd和AtomicOperation
4.0
通过一个执行链完成transaction的编程式事物控制
5.0
不支持组织机构的扩展,与业务系统进行集成时,要写很多的event来完成任务分配
6.0 可以记录冗余业务数据来组合查询任务
7.0 把已完成的流程做数据清理并备份
最后:文档比较粗糙,希望感兴趣的朋友多多交流以:whdwsl@
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690874455a452276.html
评论列表(0条)