保姆级教程:在Flowable 6.x中配置调用子流程,实现多实例并行审批

张开发
2026/4/21 14:36:01 15 分钟阅读

分享文章

保姆级教程:在Flowable 6.x中配置调用子流程,实现多实例并行审批
保姆级教程在Flowable 6.x中配置调用子流程实现多实例并行审批当企业审批流程需要多个部门负责人同时签署意见时传统的串行审批会导致效率瓶颈。Flowable的调用子流程配合多实例特性能像交响乐指挥一样精准协调多个并行审批任务。本文将手把手带您实现一个真实的部门经理会签场景从BPMN绘制到参数传递彻底掌握这一高频需求。1. 理解调用子流程的核心机制调用子流程Call Activity是BPMN规范中的标准元素它允许一个流程实例动态启动另一个独立的流程实例。与嵌套子流程不同被调用的流程拥有自己的生命周期和实例ID这种松耦合设计带来了三大独特优势流程复用通用审批逻辑如部门审核可封装为独立流程供多个主流程调用并行扩展通过多实例配置单次调用可触发多个子流程实例并行运行参数隔离主流程与子流程通过明确定义的输入输出参数交互避免变量污染在采购审批场景中当需要技术部、财务部、法务部三个部门并行会签时调用子流程的架构优势尤为明显。主流程只需配置一次调用节点系统就会自动创建三个独立的审批实例。2. 构建基础BPMN模型2.1 主流程设计使用Flowable Modeler创建主流程purchase_approval关键节点包括process idpurchase_approval name采购审批主流程 startEvent idstart/ userTask idinitiate name发起采购申请/ callActivity idmultiDeptSign name多部门会签/ exclusiveGateway iddecision/ userTask idceoApprove nameCEO最终审批/ endEvent idend/ /process2.2 子流程设计新建department_approval作为被调用流程process iddepartment_approval name部门审批子流程 startEvent idsubStart/ userTask iddeptReview name部门负责人审批 extensionElements flowable:formProperty idcomment name审批意见 typestring/ /extensionElements /userTask endEvent idsubEnd/ /process提示子流程的ID必须与调用配置严格匹配建议使用全小写下划线命名规范3. 配置多实例调用活动3.1 关键属性设置在multiDeptSign调用节点配置被调用元素类型选择Key推荐或ID被调用元素值填写department_approval多实例类型选择Parallel并行3.2 集合与变量配置配置项值示例作用说明集合(Collection)${deptList}存储部门ID数组的流程变量元素变量currentDept迭代时存储当前部门ID完成条件${nrOfCompletedInstances/nrOfInstances 0.6}60%通过即继续对应的Java代码设置变量MapString, Object variables new HashMap(); variables.put(deptList, Arrays.asList(dept_tech, dept_finance, dept_legal)); runtimeService.startProcessInstanceByKey(purchase_approval, variables);4. 实现参数双向传递4.1 输入参数映射将主流程的采购单ID传递给所有子流程实例callActivity idmultiDeptSign calledElementdepartment_approval extensionElements flowable:in sourcepurchaseId targetpurchaseId/ /extensionElements /callActivity4.2 输出参数处理由于并行模式下输出参数受限推荐两种解决方案方案一使用信号事件sequenceFlow idtoSignal sourceRefdeptReview targetRefsignalEnd/ intermediateThrowEvent idsignalEnd signalEventDefinition signalRefapprovalSignal/ /intermediateThrowEvent方案二服务任务写库public class ApprovalResultCollector implements JavaDelegate { public void execute(DelegateExecution execution) { String comment (String) execution.getVariable(comment); // 写入数据库或消息队列 } }5. 调试与性能优化5.1 历史数据验证SELECT * FROM ACT_HI_PROCINST WHERE CALL_PROC_INST_ID_ 主流程实例ID;5.2 性能优化建议对高频调用的子流程启用async: true属性在集合变量中使用轻量级ID而非完整对象设置合理的asyncExecutor线程池大小我在实际项目中遇到过200并行实例的场景通过预加载子流程定义和启用二级缓存将响应时间从8秒降至1.2秒。关键是在测试环境充分模拟高并发情况使用FlowableStressTest工具进行基准测试。

更多文章