等待异步子流程节点
简介
「等待异步子流程」(WAIT_FOR_ASYNC_SUB_FLOWS)节点用于在流程派发了若干异步子流程(SubFlow 节点且 async = true)之后,在某个汇合点阻塞父流程,直到这些子流程满足配置的放行条件后再继续往下执行。
它的语义类似 Java 的 Thread.join() 或 CompletableFuture.allOf().join():先并行派发多个异步子流程,再在一个点上等它们跑完(或达到某个阈值)后统一继续。
解决什么问题
默认情况下,SubFlow 节点 async = true 时,父流程「派发后即返回」,继续往下执行,不会感知子流程的成败。当业务需要「先并行处理 N 个子流程,再等它们完成后汇总/继续」时,就需要用这个节点在汇合点等待。
使用限制
- 仅支持内存模式流程:该节点只能用在触发器开启了「内存模式」(Runs in Memory)的流程中。非内存(持久化)模式的流程若包含此节点,保存/发布时会报错并阻止保存。
- 只等待直接子流程:等待范围是当前流程实例直接派发的异步子流程(
parent_id = 当前流程实例),不递归等待孙子流程。如果需要等待孙子流程,请在中间层流程里再放一个等待节点。 - 超时不会取消子流程:超时只是让父流程放行,已派发的子流程仍在后台继续运行。
等待范围
- 等待范围按流程实例划界:等待「当前流程实例下、本节点之前派发出去的」所有
async = true的直接子流程。 - 不按线程/迭代划分:如果异步子流程是在
Repeat(循环)并行迭代里派发的,各迭代派发的子流程都会被纳入等待范围。 - 节点进入时会扫描当前实例下的全部异步子流程(不论已完成还是运行中)。已经在父流程到达本节点之前就跑完的「快子流程」也会被正确计入,不会漏算。
完成策略(completionMode)
节点提供四种并列的完成策略。节点的最终状态(成功 / 失败)统一由 onConditionMet(条件满足时)和 onConditionUnmet(条件不满足时)两个配置决定,每种模式有各自的默认值。
| 完成策略 | 等待/放行条件 | 条件满足时(onConditionMet)默认 | 条件不满足时(onConditionUnmet)默认 |
|---|---|---|---|
| 全部完成(ALL_COMPLETED,默认) | 等所有子流程到达终态,只看是否完成、不看成败 | 节点恒为成功 | — |
| 全部成功(ALL_SUCCESS) | 等所有子流程到达终态,要求全部成功 | 全部成功 → 成功 | 任一失败 → 失败 |
| 达到失败阈值(FAILURE_THRESHOLD) | 失败累计数 ≥ 失败阈值 时提前放行 | 达到阈值 → 失败 | 全跑完仍未达到阈值 → 成功 |
| 达到成功阈值(SUCCESS_THRESHOLD) | 成功累计数 ≥ 成功阈值 时提前放行 | 达到阈值 → 成功 | 全跑完仍未凑够 → 失败 |
说明:
- 「全部完成」和「全部成功」的区别:前者只关心子流程是否结束,无论成败节点都成功;后者要求全部成功,只要有一个失败,节点默认就失败。
- 阈值模式下的「提前放行」意味着一旦满足阈值,父流程立即继续,剩余仍在运行的子流程不会被取消,仍在后台执行。
- 上表是默认值,
onConditionMet/onConditionUnmet都可以在配置面板上手动改成「成功」或「失败」,以适配业务需求(例如让「全部成功」模式即使有失败也放行成功)。
配置项
| 配置项 | 说明 | 默认值 |
|---|---|---|
| 完成策略(completionMode) | 四种策略之一,见上表 | 全部完成(ALL_COMPLETED) |
| 失败阈值(failureThreshold) | 仅「达到失败阈值」模式需要,必须 ≥ 1 | 无(发布期强制校验) |
| 成功阈值(successThreshold) | 仅「达到成功阈值」模式需要,必须 ≥ 1 | 无(发布期强制校验) |
| 条件满足时的节点状态(onConditionMet) | 成功 / 失败 | 按模式默认(见上表) |
| 条件不满足时的节点状态(onConditionUnmet) | 成功 / 失败 | 按模式默认(见上表) |
| 无子流程时的状态(notTriggered) | 进入节点时若没有任何可等待的异步子流程,节点以此状态直接放行;设为「失败」可在「本应有子流程却一个都没有」时让流程报错中断 | 成功 |
| 等待范围过滤(waitForNodeIds) | 可选。指定只等待某些 SubFlow 节点派发出来的子流程。这是范围过滤器,不是数量契约——不代表「必须齐 N 个」。若要表达「必须够 N 个」请用阈值模式 | 空(等待全部异步子流程) |
| 超时时长(timeout) | 可选。为空表示一直等待 | 空 |
| 超时单位(timeUnit) | 天 / 小时 / 分钟 / 秒 | 秒 |
| 包含子流程明细(includeSubFlowDetails) | 输出中是否包含每个子流程的完整 output | false |
| 最大跟踪子流程数(maxTrackedSubFlows) | 输出明细的条数上限,防止输出膨胀;只截断输出明细,不影响等待判断的正确性 | 500 |
超时
- 配置了超时后,若到点仍未满足完成条件,节点会以成功 / 失败终态收尾(走
onConditionUnmet,默认失败),而不是一个单独的「超时」状态。你可以据此接入错误处理节点。 - 超时不会取消未完成的子流程,它们仍在后台继续运行。
- 输出中会通过
timeout: true和terminationReason: TIMED_OUT标识这是一次超时收尾。
输出
节点到达终态后,输出(可被后续节点引用)包含:
| 字段 | 说明 |
|---|---|
nodeResult | 节点终态:SUCCESS / FAILURE |
terminationReason | 收尾原因码,如 ALL_COMPLETED / ALL_SUCCEEDED / SOME_FAILED / FAILURE_THRESHOLD_REACHED / SUCCESS_THRESHOLD_REACHED / TIMED_OUT / NO_ASYNC_SUB_FLOWS 等 |
message | 本地化的一句话结果说明 |
completionMode | 触发放行的完成策略 |
conditionMet | 完成条件是否被满足(true 走 onConditionMet,false 走 onConditionUnmet;超时为 false) |
total | 等待范围内子流程总数 |
success / failure / pending | 成功 / 失败 / 仍未完成的子流程计数 |
timeout | 是否因超时收尾 |
stillPending | 提前放行或超时时,仍未完成的子流程 id 列表 |
subFlows | 每个子流程的摘要(子流程唯一标识、派发它的节点、节点名、定义 id、状态;includeSubFlowDetails = true 时额外带 output) |
warnings | 诊断信息(如节点位置疑似放错、明细被截断等) |
提示:
subFlows明细中的子流程标识为内存/持久化一致的flowInstanceUniqueId(UUID)。
备注
本节点在流程实例视图里,只有到达终态(DONE)后才会展示输出;在等待过程中(IN_PROGRESS)不展示。
典型用法
- 用一个
Repeat循环或多个SubFlow节点并行派发若干async = true的子流程。 - 在这些派发节点之后放置一个「等待异步子流程」节点。
- 选择完成策略:
- 想「等全部跑完就继续,不在意成败」→ 全部完成。
- 想「必须全部成功才继续」→ 全部成功。
- 想「只要成功够 N 个就继续」→ 达到成功阈值 + 填成功阈值。
- 想「失败太多就提前中断」→ 达到失败阈值 + 填失败阈值。
- 视需要配置超时、
onConditionMet/onConditionUnmet的终态、是否输出子流程明细等。