ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

activiti源码简析

activiti源码简析 Activiti架构分析及源码详解【2023最新Activiti7全网最全】activiti7工作流数据库表详细介绍25张表Activiti架构分析及源码详解第1步: 先创建1个 processInstanceExecutionEntity 第2步: 创建 processInstanceExecutionEntity 的 childExecutionEntity 第3步: childExecutionEntity 设置 currentFlowElement 为 StartEvent 第4步: commandContext.getAgenda().planContinueProcessOperation(childExecutionEntity) 第5步: 在 ContinueProcessOperation 中获取 childExecutionEntity 的 StartEvent, 即 StartEvent, 由于 StartEvent 是 FlowNode, 所以执行 continueThroughFlowNode, 此时执行 executeActivityBehavior(activityBehavior, flowNode), 即 会执行 StartEvent 的 activityBehavior.execute(execution), 此时会走到 FlowNodeActivityBehavior#execute(DelegateExecution execution), 即 调用了 FlowNodeActivityBehavior#leave(childExecutionEntity), 此时会调用 getAgenda().planTakeOutgoingSequenceFlowsOperation(childExecutionEntity, true), 第6步: 在 TakeOutgoingSequenceFlowsOperation 中获取 childExecutionEntity 的 StartEvent, 即 StartEvent, 由于 StartEvent 是 FlowNode, 所以执行 handleFlowNode, 此时执行 leaveFlowNode(StartEvent), 然后 会将 startEvent 的 outgoingFlow 作为 设置给 childExecutionEntity 的 currentFlowElement 属性, 然后 调用 Context.getAgenda().planContinueProcessOperation(outgoingExecution) 第7步: 在 ContinueProcessOperation 中获取 childExecutionEntity 的 currentFlowElement, 即 outgoingFlow, 由于 outgoingFlow 是 SequenceFlow, 所以执行 continueThroughSequenceFlow, 此时 会将 outgoingFlow 的 targetFlowElement, 也就是 userTask 设置给 childExecutionEntity 的 currentFlowElement 属性, 然后 会调用 Context.getAgenda().planContinueProcessOperation(childExecutionEntity) 第8步: 在 ContinueProcessOperation 中获取 childExecutionEntity 的 currentFlowElement, 即 userTask, 由于 userTask 是 FlowNode, 所以执行 continueThroughFlowNode, 此时执行 executeActivityBehavior(activityBehavior, userTask), 即 会执行 userTask 的 activityBehavior.execute(execution), 此时会走到 UserTaskActivityBehavior.execute(childExecutionEntity), 然后 插入任务到 act_ru_task 表, 随后由于该任务需要人工办理, 因此结束, 等待人工处理后, 再次触发 第9步: 人工办理任务时, 会从 act_ru_task 表 删除任务, 然后根据taskId 得到 childExecutionEntity, 然后 Context.getAgenda().planTriggerExecutionOperation(childExecutionEntity), 第10步骤: 在 TriggerExecutionOperation 中获取 userTask 的 userTaskActvitiBehavior, 调用 userTaskActvitiBehavior.trigger(childExecutionEntity), 继而调用到 AbstractBpmnActivityBehavior#leave(childExecutionEntity), 由于 userTask 不是多实例, 直接 转而调用 FlowNodeActivityBehavior#leave(childExecutionEntity), 此时会调用 getAgenda().planTakeOutgoingSequenceFlowsOperation(childExecutionEntity, true), 然后 接着第6步 接着走的逻辑, 只不过此时是 userTask 而不是 startEvent
返回列表