Flowable 调用活动实战:从单点复用到并行扇出的 5 个关键配置 Flowable 调用活动实战从单点复用到并行扇出的 5 个关键配置【免费下载链接】flowable-engineA compact and highly efficient workflow and Business Process Management (BPM) platform for developers, system admins and business users.项目地址: https://gitcode.com/GitHub_Trending/fl/flowable-engine订单服务里信用检查逻辑改了 11 次每次都要同步打开主流程 BPMN 调参数运维同学已经开始投诉。这就是把子流程写成主流程里一串节点的代价。把这一段换成 Flowable 调用活动Call Activity后主流程里只剩一个callCheckCreditProcess节点信用检查逻辑再变只重新部署子流程定义改动点从 3 处降到 1 处主流程文件不用动。下面按配置、传参、动态路由、并行调用和踩坑五个点展开。一张图看懂调用关系引擎执行到调用活动节点时不会就地跑逻辑而是为calledElement指向的子流程创建一个独立的流程实例子流程实例结束后主流程才从调用活动的出向连线继续走。完整链路是主流程 → 网关 → 调用活动 → 子流程实例独立执行→ 回到主流程。下图是官方文档中调用活动节点的典型拓扑调用活动和普通 User Task / Service Task 的本质区别就三条子流程是独立的process定义单独的文件、独立的部署与版本管理不是主流程里的节点片段子流程有独立的流程实例有自己的 processInstanceId 和生命周期实例结束时调用活动才算完成变量边界清晰父子实例默认不共享变量数据只能靠显式传递进出最小可运行片段如下仓库里的 mainProcess.bpmn20.xml 就是这套结构process idmainProcess nameMain process with call activity startEvent idtheStart / callActivity idtheChildProcess nameChild Process calledElementchildProcess / endEvent idtheEnd / /processcalledElement是唯一必填项取值对应子流程定义里的process id。其余属性inheritVariables、businessKey、in/out 参数等都定义在 CallActivity.java 中。三种传参方式怎么选档 1变量继承原型和测试阶段够用。callActivity idtheChildProcess calledElementchildProcess activiti:inheritVariablestrue /风险要讲清楚这个模式下父变量自动带入子实例且子流程对变量的任何写入都会回写父实例。审批状态被子流程意外覆盖的风险在多人协作维护子流程的场景下几乎是必然所以别把它带进生产。档 2显式参数映射生产推荐。只暴露你声明过的变量父子实例其余内容互不可见callActivity idcallCheckCreditProcess nameCheck credit calledElementcheckCreditProcess extensionElements activiti:inParameter sourceorderId targetsubOrderId / activiti:outParameter sourceapprovalResult targetcreditCheckResult / /extensionElements /callActivityinParameter的 source 是父流程变量、target 是子流程变量outParameter方向相反。参数解析逻辑就是 CallActivity 里的getInParameters()/getOutParameters()XML 里每写一行映射运行时就建一条定向通道。档 3业务键 外部存储数据量大时的兜底。大对象文件、明细列表不要塞进流程变量只传业务键做引用callActivity idtheChildProcess calledElementchildProcess activiti:businessKey${orderId} /子流程拿到 businessKey 后自己查数据库或对象存储流程实例里只留一个指针。方式适用场景维护成本inheritVariables原型、联调低但子流程一改就可能污染父变量in/out 参数映射生产环境的参数传递中每次加减字段都要同步两侧定义业务键 外部存储大数据量、附件类数据高需维护外部读写逻辑动态路由 并行扇出用 UEL 表达式让 calledElement 随变量切换callActivity iddynamicCall calledElement${orderType VIP ? vipProcess : standardProcess} /表达式在运行时求值引擎走到这个调用活动时才解析${...}所以 VIP 订单走专属审核子流程、普通订单走标准子流程主流程文件不用改。仓库里的 processWithDynamicCallActivity.bpmn20.xml 演示了用户任务 调用活动的组合适合先人工确认、再按类型路由的场景。并行网关扇出两个调用活动parallelGateway idfork / sequenceFlow sourceReffork targetRefcallActivity1 / sequenceFlow sourceReffork targetRefcallActivity2 / callActivity idcallActivity1 calledElementstockCheckProcess / callActivity idcallActivity2 calledElementcheckCreditProcess / sequenceFlow sourceRefcallActivity1 targetRefjoin / sequenceFlow sourceRefcallActivity2 targetRefjoin / parallelGateway idjoin /注意 join 端是并行网关语义是必须等所有分支完成才放行不是取先到者。典型场景是库存查询 信用检查同时发起两个子流程都结束、结果都写回父实例后主流程才走到是否发货的排他网关。四个容易踩的坑⚠️嵌套超过 2 层调试开始痛苦。调用活动里再套调用活动时一个变量断在第三层实例里你很难一眼定位它属于哪一层。正确做法控制嵌套深度 ≤ 2超过就拆成协调流程 兄弟子流程的平铺结构。⚠️子流程 error 没被接住主流程直接挂起。子流程内抛出 error 事件且无边界事件捕获子实例中断调用活动永远等不到完成主流程停摆。正确做法是给调用活动挂边界事件把子流程的异常转成主流程可控的分支callActivity idcallActivity calledElementriskyProcess boundaryEvent iderrorBoundary attachedToRefcallActivity errorEventDefinition errorRefcreditCheckFailed / /boundaryEvent /callActivity⚠️businessKey 继承后主/子共享同一 key日志混淆。activiti:inheritBusinessKeytrue会把父流程业务键原样传给子实例历史表里按 businessKey 过滤时两个实例混在一起出问题时很难区分父子。正确做法子流程用activiti:businessKey${orderId}-credit这类带标识后缀的键让父子键可区分。⚠️并行调用里一个分支抛 error另一个分支的写回丢失。扇出后分支 A 抛错中断分支 B 的 outParameter 写回可能来不及完整落到父实例join 之后主流程读到的就是 null 或旧值。正确做法子流程内部先用边界事件把 error 消化掉、保证结束前结果变量已写出让 join 只能看到完整结束的实例别指望网关替你兜底脏状态。落地检查清单 延伸阅读上线前逐项过一遍calledElement指向的 process 定义已部署且是最新版本in/out 参数双向对齐target 在子流程里存在、source 在父流程里存在并行 join 用的是 parallelGateway而不是 merge 或 exclusive 网关子流程可能抛出的每个 errorRef 都有对应的边界事件覆盖调用活动嵌套层级 ≤ 2businessKey 带区分后缀避免主/子实例 key 冲突延伸阅读仓库内相对路径CallActivity.javainheritVariables、sameDeployment、useLocalScopeForOutParameters 等全部属性的定义与克隆逻辑CallActivityTest.java调用活动事件与完成行为的边界测试callactivity 测试资源目录动态调用、业务键继承等全部 BPMN 样例orderProcess.bpmn20.xml 是订单场景的完整参照【免费下载链接】flowable-engineA compact and highly efficient workflow and Business Process Management (BPM) platform for developers, system admins and business users.项目地址: https://gitcode.com/GitHub_Trending/fl/flowable-engine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考