跳到主要内容

等待异步子流程节点

简介

「等待异步子流程」(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)输出中是否包含每个子流程的完整 outputfalse
最大跟踪子流程数(maxTrackedSubFlows)输出明细的条数上限,防止输出膨胀;只截断输出明细,不影响等待判断的正确性500

超时

  • 配置了超时后,若到点仍未满足完成条件,节点会以成功 / 失败终态收尾(走 onConditionUnmet,默认失败),而不是一个单独的「超时」状态。你可以据此接入错误处理节点。
  • 超时不会取消未完成的子流程,它们仍在后台继续运行。
  • 输出中会通过 timeout: trueterminationReason: 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)不展示。

典型用法

  1. 用一个 Repeat 循环或多个 SubFlow 节点并行派发若干 async = true 的子流程。
  2. 在这些派发节点之后放置一个「等待异步子流程」节点。
  3. 选择完成策略:
    • 想「等全部跑完就继续,不在意成败」→ 全部完成
    • 想「必须全部成功才继续」→ 全部成功
    • 想「只要成功够 N 个就继续」→ 达到成功阈值 + 填成功阈值。
    • 想「失败太多就提前中断」→ 达到失败阈值 + 填失败阈值。
  4. 视需要配置超时、onConditionMet / onConditionUnmet 的终态、是否输出子流程明细等。