工作流并行网关退回思路

问题描述

在设计工作流时遇到并行的流程,会出现并行流程的退回,这里记录下想到的解决思路,后续问题会记录在这里。

流程图

这里是一个简单的流程图:
在这里插入图片描述

并行退回思路

若是正常流程退回,流程是:

  1. 获取回退节点id,获取当前任务id
  2. 保存当前任务节点id流向
  3. 清除当前任务节点

如果当前节点在2.1、2.2,想要退回到节点1,思路为:
处于并行网关内回退至网关外节点(如2.1回退到1),需考虑2.2是否已经完成,若已完成则不用管,若未完成,则需将2.2任务删除,否则会出现两个不同的退回信息

如果当前节点在3,想要退回到节点2.1,思路为:
处于并行网关外回退至网关内节点(如3回退到2.1),需将2.2也回退,不然2.1通过后3不会创建新任务

<think>嗯,用户这次在问Jeecgboot3.7.2结合Vue3实现Flowable并行网关回退与驳回的具体方法,看来是位做BPM开发的工程师,正在处理工作流引擎的深度集成问题。从用户前两次的提问能看出ta对Flowable引擎的并行网关机制理解很深,上次我详细解释了网关回退的底层原理和常见问题,这次ta更关注具体落地实现。用户特别提到参考站内的两个代码片段引用,说明ta手头应该有基于Jeecgboot二次开发的项目,需要解决生产环境中的网关回退功能缺失问题。用户可能面临的实际痛点是:现有工作流并行网关处无法正确回退,要么出现状态异常,要么遗漏部分分支。ta需要的不仅是API调用说明,而是从UI到后端的完整改造方案,尤其关注Vue3前端如何与控制层协同。值得注意的细节是引用里提到的"Nbcio_"前缀标识,这显然是特定业务场景的标记。用户可能在自己项目中扩展了Flowable模型,需要兼容原有流程定义。在回复时需要强调这个标识的传播逻辑——从前端勾选框到后端的PREFIX检查必须闭环。技术上要拆解三个层面:前端如何增加并行网关开关(el-checkbox绑定)、后端如何拦截特殊流程(通过流程定义ID前缀判断)、核心网关处理器如何改造(特别是分支同步和回收泄漏的execution)。其中多实例会签任务的三层执行树处理最易出错,需重点给出ExecutionEntity操作示例。安全方面需提醒用户,开启并行网关回退可能影响在途流程,最好配套提供数据修复脚本(如清理ACT_RU_EXECUTION的残留分支)。性能上注意PgExecutionHandler中的递归操作应限制深度。最后生成的问题延伸很必要,用户后续肯定会遇到并行+会签的组合场景异常,需要预先给出排查路径。</think> 在Jeecgboot 3.7.2 + Vue3 + Flowable中实现**并行网关的回退与驳回功能**,需从前端配置到后端处理深度集成。以下是具体实现方法: --- ### 一、前端配置(Vue3) 在流程设计器的表单中增加**并行网关开关**,用于标识特殊流程: ```vue <!-- src/views/modules/bpm/task/TaskForm.vue --> <el-form-item label="并行网关支持" prop="parallelGateway"> <el-checkbox v-model="modelForm.parallelGateway" label="启用并行网关退回/驳回" /> </el-form-item> ``` *关键点*:通过`Nbcio_`前缀标记支持并行网关的流程[^1] --- ### 二、后端关键处理(Java) 在任务完成逻辑中**拦截并行网关操作**,调用专用处理器: ```java // src/main/java/org/jeecg/modules/bpm/service/impl/BpmTaskServiceImpl.java public void completeTask(String taskId, Map<String, Object> variables) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); // 检查是否为需特殊处理的并行网关流程 if (task.getProcessDefinitionId().startsWith("Nbcio_")) { PgExecutionHandler.handleParallelGateway(task); // 并行网关专用处理器 } else { taskService.complete(taskId, variables); // 标准流程 } } ``` --- ### 三、核心网关处理器逻辑 `PgExecutionHandler`的核心操作包括: #### 1. **分支同步回退** ```java // src/main/java/org/jeecg/modules/bpm/utils/PgExecutionHandler.java public static void handleParallelGateway(Task task) { ExecutionEntity execution = (ExecutionEntity) runtimeService .createExecutionQuery() .executionId(task.getExecutionId()) .singleResult(); // 获取所有同级分支 List<ExecutionEntity> siblingExecutions = executionEntityManager .findChildExecutionsByParentExecutionId(execution.getParentId()); // 同步回退到目标节点 for (ExecutionEntity sibling : siblingExecutions) { if (sibling.isActive()) { sibling.setActivity(targetActivity); // 目标节点如userTask1 executionEntityManager.update(sibling); } } // 清理残留执行流(防止死锁) deleteOrphanedExecutions(execution.getProcessInstanceId()); } ``` #### 2. **残留分支清理算法** ```java private void deleteOrphanedExecutions(String processInstanceId) { List<ExecutionEntity> executions = executionEntityManager .findExecutionsByProcessInstanceId(processInstanceId); executions.stream() .filter(e -> e.getActivity() == null) // 无活跃节点的执行流 .filter(e -> e.getChildExecutions().isEmpty()) // 无子分支 .forEach(executionEntityManager::delete); } ``` --- ### 四、解决三大技术难点 1. **分支状态同步** - 通过`findChildExecutionsByParentExecutionId()`定位同层级分支 - 对所有分支执行`setActivity()`确保同步跳转 2. **执行流泄漏处理** - 清理`ACT_RU_EXECUTION`中`IS_ACTIVE=0`且无子节点的记录 - 避免网关汇聚时因计数错误导致死锁[^1] 3. **多实例任务兼容** - 在回退会签节点时,需额外处理`ACT_RU_EXECUTION`中的三层结构: ```mermaid execution_tree 流程实例(PI) │ └── 会签主分支(exec1) ├── 会签任务1(exec1_1) └── 会签任务2(exec1_2) ``` - 先删除叶子任务,再向上合并主分支 --- ### 五、生产环境验证 1. **启用标记前缀的流程** - 流程定义ID需满足`Nbcio_{流程Key}`格式(如`Nbcio_parallelReview`) 2. **回退操作步骤**: ```mermaid sequenceDiagram 前端->>+后端: 提交退回请求(含Nbcio_前缀) 后端->>Flowable: 拦截标准complete() 后端->>专用处理器: 调用PgExecutionHandler 专用处理器->>Flowable: 按分支更新ACT_RU_EXECUTION 专用处理器->>DB: 清理孤立执行流 后端-->>前端: 返回成功及新的任务节点 ``` --- ### 六、注意事项 1. **历史流程兼容** - 已有流程需通过`alter table act_re_procdef`增加前缀才能支持 2. **性能影响** - 建议对超过**50个并行分支**的流程做分批处理 3. **错误排查** - 检查`ACT_RU_EXECUTION`中是否存在: - `parent_id`相同的未同步分支 - `activity_id`为null的残留记录 > 实现效果:当勾选前端开关后,可**正确回退并行网关的所有分支**,避免状态不一致导致的流程阻塞[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值