ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

深入理解RuoYi-activiti流程状态机:执行实例、流程实例、任务三者的关系与生命周期

深入理解RuoYi-activiti流程状态机:执行实例、流程实例、任务三者的关系与生命周期 深入理解RuoYi-activiti流程状态机执行实例、流程实例、任务三者的关系与生命周期【免费下载链接】RuoYi-activiti整合RuoYi框架基于Activiti6.0集流程设计、流程部署、流程执行、任务办理、流程监控于一体的开源工作流开发平台。项目地址: https://gitcode.com/gh_mirrors/sp/RuoYi-activitiRuoYi-activiti 是基于 Activiti 6.0 引擎打造的开源工作流开发平台集流程设计、流程部署、流程执行、任务办理、流程监控于一体。想真正用好这套工作流平台最关键的突破口就是理解它的流程状态机——搞懂执行实例、流程实例、任务三者的关系与生命周期。本文将用最直白的方式带你一次看懂这三个概念的来龙去脉不再死记硬背。为什么新手一定要懂流程状态机很多人第一次接触工作流引擎时会懵为什么同一个流程里会有执行实例编号和流程实例编号两个 ID为什么流程走到一半待办任务会凭空出现又消失答案就在于Activiti 内部用一套状态机驱动流程前进。流程一旦启动引擎就创建出执行来代表当前走到哪了走到用户任务节点就生成任务等待人工办理任务办理完毕执行继续向前直到结束事件整条链路的数据从运行时表act_ru_转入历史表act_hi_。理解了这条主线你就理解了 RuoYi-activiti 全部功能页面的底层逻辑——流程实例管理、待办任务、流程进度追踪都是在这条主线上做查询和操作。三个核心概念分别是什么执行实例Execution流程走到哪的指针执行实例是引擎里最基础的运行时对象对应数据库表act_ru_execution项目中的实体定义为 ActRuExecution.java。你可以把它理解为流程当前的游标actId当前执行所在的活动节点 ID相当于流程走到了哪个节点parentId父执行 ID用于组织执行树见下文isActive/isConcurrent标记执行是否活跃、是否是并行分支产生suspensionState挂起状态挂起/唤醒操作就是改它一个简单流程里通常只有一个执行实例一旦遇到并行网关一个执行会分裂成多个并发执行每个分支各持一个执行实例。流程实例Process Instance一次流程运行的身份证流程实例就是那棵树最顶端的根执行实例——引擎对它的特殊叫法。你发起一次请假申请就产生一个流程实例它代表这次申请从头到尾的完整运行。在代码里流程实例通过runtimeService.startProcessInstanceByKey创建比如请假流程的启动就在 LeaveapplyServiceImpl.java启动时传入流程定义 Key如leave和业务编号 businessKey请假单 ID流程实例的 ID 就是根执行实例的 ID两者一一对应流程实例是挂起、唤醒、删除等管理操作的主体任务Task等人工出手的待办任务只在流程走到用户任务节点时才会诞生办理完成后立即消失。它对应act_ru_task表列表查询返回的字段定义在 TaskInfo.java几个关键字段一眼看穿三者关系字段含义taskId任务自己的 ID办理任务的唯一凭证processInstanceId属于哪个流程实例executionId属于哪条执行分支businessKey关联的业务单据编号assignee当前办理人formKey前端通过它找到对应的办理表单页面也就是说任务只是流程实例生命周期中的一段插曲它靠 processInstanceId 和 executionId 两条线同时挂回流程。三者的关系一棵会生长、会分裂的树三者的关系用一棵执行树就能说清流程实例根执行 └── 当前执行actId 用户任务A→ 生成任务A └── 并行网关后分裂 ├── 分支执行1isConcurrent1→ 生成任务B └── 分支执行2isConcurrent1→ 生成任务C1 个流程实例 1 棵执行树根执行即流程实例本身1 条活跃执行最多对应1 个当前任务走到用户任务节点才产生1 个任务必然能追溯回1 条执行 1 个流程实例串行流程执行实例只有一个任务一个接一个出现并行流程执行分裂任务同时出现RuoYi-activiti 的全部待办列表就同时展示了流程实例编号与执行实例编号两列正是这套结构在页面上的直接映射完整生命周期从发起到归档的四步以平台自带的请假流程为例一次流程的完整生命周期如下第 1 步发起流程 → 诞生流程实例提交请假单后业务表先落库然后启动流程此时act_ru_execution中写入根执行流程实例businessKey绑定请假单 ID让流程数据和业务数据可以互相找到对方第 2 步走到用户任务 → 任务出现并等待办理执行指针停在部门领导审批节点引擎创建任务并指派办理人任务进入待办列表。办理人点办理时统一走 TaskController.java 中的completeTask接口引擎先记录审批意见comment再调用taskService.complete完成任务。第 3 步任务完成 → 执行继续向前任务从act_ru_task中移除执行实例的actId指向下一个节点。遇到网关就按分支条件前进遇到并行网关就分裂出多条执行汇合后再合并。第 4 步到达结束事件 → 流程实例消亡历史留存所有执行结束act_ru_*运行时数据被清理完整的审批记录转入act_hi_*历史表——这就是运行历史页面能看到已归档流程的原因。整个过程中管理者还随时可以对运行中的流程实例做挂起/唤醒对应 FlowMonitorController.java挂起后suspensionState变为挂起状态该实例名下的所有待办任务不再显示唤醒后流程从暂停处继续——这正是状态机可观测、可操控的体现。在页面上验证流程进度追踪理解了状态机后最有说服力的验证是流程进度功能它根据流程实例当前活跃的执行位置在流程图上高亮出现在走到哪——红框标注的节点就是当前执行实例的actId图中主流程停在采购经理审批子流程付款子流程从属挂在主流程之下——子流程本质上是主流程执行树里挂出的一棵小树由rootProcInstId字段指回根流程实例。这就是执行树结构在复杂场景下的真实样貌。新手最常问的 4 个问题Q1流程实例 ID 和执行实例 ID 什么时候相同根执行 流程实例所以流程实例 ID 就是根执行的 ID串行流程中当前执行也常与根执行是同一个此时两列编号相同属正常现象。Q2流程结束后还能查到任务吗运行时任务查不到了但历史表里有完整的任务流转记录运行历史和办理页的时间轴就是查这里。Q3业务编号 businessKey 有什么用它是流程与业务单据的桥梁由流程实例可反查请假单/采购单由单据也可反查流程避免业务数据和流程数据两张皮。Q4挂起的流程数据去哪了数据还在act_ru_*表中只是suspensionState被标记为挂起任务查询会用active()条件过滤掉它。相关源码与资料路径资料路径执行实例实体ruoyi-system/src/main/java/com/ruoyi/system/domain/ActRuExecution.java任务列表字段ruoyi-system/src/main/java/com/ruoyi/system/domain/TaskInfo.java任务办理接口ruoyi-admin/src/main/java/com/ruoyi/web/controller/activiti/TaskController.java流程实例挂起/唤醒ruoyi-admin/src/main/java/com/ruoyi/web/controller/activiti/FlowMonitorController.java流程启动示例ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LeaveapplyServiceImpl.java数据库脚本ry-activiti.sql使用说明README.md一句话总结流程实例是一次流程运行执行实例是流程走到哪的指针并行时会分裂成树任务是走到用户节点时产生、办理完即消失的待办。抓住这条实例—执行—任务的主线RuoYi-activiti 的所有监控与管理页面就都通了。【免费下载链接】RuoYi-activiti整合RuoYi框架基于Activiti6.0集流程设计、流程部署、流程执行、任务办理、流程监控于一体的开源工作流开发平台。项目地址: https://gitcode.com/gh_mirrors/sp/RuoYi-activiti创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表