1.启动部署:
默认default模式,将所有bpmn组成一个group,group中任何一个bpmn更新,部署时:
a) 插入act_re_deployment表1条新记录,spring自动部署记录
b) 插入act_re_procdef表每个bpmn 1条新记录
c) 插入act_ge_bytearray表每个bpmn 2条记录,存bpmn文件和对应bpmn的png
2.启动工作流:
1. 通过key从ACT_RE_PROCDEF中获取org.flowable.engine.repository.ProcessDefinition;
ProcessDefinition.xml ==> selectLatestProcessDefinitionByKey (param:key,processDefinitionKey;
value = processDefinitionKey的值);
2. 得到ProcessDefinition的属性processDefinitionId,deploymentId;
3. 通过processDefinitionId从processDefinitionCache中获取ProcessDefinitionCacheEntry;
4. 如果ProcessDefinitionCacheEntry不存在,通过deploymentID
从ACT_RE_DEPLOYMENT获取org.flowable.engine.impl.persistence.entity.DeploymentEntity;
5. DeploymentManager.deploy,参数是上一步的DeploymentEntity,将结果放入processDefinitionCache中;
6. ProcessInstanceHelper.createProcessInstance,参数是processDefinition和startProcessInstance=true;
7. 从processDefinitionCache中获取对应的org.flowable.bpmn.model.Process;
8. 根据上一步的process获取流程起始点(initialFlowElement)org.flowable.bpmn.model.FlowElement;
9. ProcessInstanceHelper.createAndStartProcessInstanceWithInitialFlowElement,
a). 先生成org.flowable.engine.impl.persistence.entity.ExecutionEntity,生成processInstanceId
b). ProcessInstanceHelper.startProcessInstance
10. 插入表中记录
a). 插入ACT_HI_PROCINST表1条记录
b). 插入ACT_RU_EXECUTION表2条记录,主流程和第一个节点流程
c). 插入ACT_RU_JOB表1条记录
11. 异步job执行流程
a). 根据上一步中的job的id,查询ACT_RU_JOB表信息,得到Job的executionId
b). 根据上一步中的executionId,查询ACT_RU_EXECUTION记录,获取当前待执行节点
c). 执行节点功能
d). 执行完成后,插入ACT_HI_ACTINST表1条记录,已执行节点执行信息
e). ACT_RU_JOB表中新增一条记录,记录executionId
f). ACT_RU_EXECUTION表更新对应executionId和REV_的记录,REV_自增1,ACT_ID_设置为待执行的节点名称
g). ACT_RU_JOB表中删除已执行的记录
h). 流程执行完成后,更新ACT_HI_PROCINST的REV_自增1
12. 异步job执行流程失败
a). asyncExecutorNumberOfRetries默认为3
b). asyncExecutorNumberOfRetries设置为0,将job移到ACT_RU_DEADLETTER_JOB,
在ACT_GE_BYTEARRAY中记录异常,
ACT_RU_DEADLETTER_JOB.EXCEPTION_STACK_ID_ = ACT_GE_BYTEARRAY.ID_
c). asyncExecutorNumberOfRetries不为0,将job移动到ACT_RU_TIMER_JOB, 10秒后再执行
d). 在ACT_GE_BYTEARRAY中记录异常,
ACT_RU_DEADLETTER_JOB.EXCEPTION_STACK_ID_ = ACT_GE_BYTEARRAY.ID_
e). 10秒后,将ACT_RU_TIMER_JOB的记录转移到ACT_RU_JOB,删除ACT_RU_TIMER_JOB中记录
f). 执行job,失败重复3,4,5;知道重试次数超限,执行2