如何实现Netflix Conductor并行子工作流执行完毕且父流在子流失败时失败?
解决方案:让并行子工作流全部执行完毕并按需让父工作流失败
要实现「两个子工作流全部执行完毕,且任一子流失败时父工作流失败」的需求,你可以通过以下两步配置实现,无需依赖optional标记:
1. 配置FORK分支任务,确保子流失败不终止其他分支
在每个SUB_WORKFLOW任务中添加continueOnFailure: true属性,这样即使某一个子工作流失败,另一个分支仍会继续执行,不会被中途取消。
示例FORK任务配置:
{ "name": "parallel_subflows_fork", "taskReferenceName": "parallel_subflows_fork", "type": "FORK_JOIN", "forkTasks": [ [ { "name": "child_workflow_1", "taskReferenceName": "child_workflow_1_ref", "type": "SUB_WORKFLOW", "subWorkflowParam": { "name": "child_workflow_1", "version": 1 }, "continueOnFailure": true } ], [ { "name": "child_workflow_2", "taskReferenceName": "child_workflow_2_ref", "type": "SUB_WORKFLOW", "subWorkflowParam": { "name": "child_workflow_2", "version": 1 }, "continueOnFailure": true } ] ], "joinOn": ["child_workflow_1_ref", "child_workflow_2_ref"] }
2. JOIN后添加状态判断任务,控制父工作流最终状态
默认JOIN任务确实不支持直接配置失败规则,但可以在JOIN之后添加一个SWITCH任务,结合FAIL任务实现父工作流的失败逻辑:
- 利用表达式判断两个子工作流的执行状态(检查是否存在
FAILED或COMPLETED_WITH_ERRORS状态) - 若存在失败子流,执行
FAIL任务将父工作流标记为FAILED;若全部成功,则直接结束父工作流
示例判断任务配置:
{ "name": "check_subflow_status", "taskReferenceName": "check_subflow_status", "type": "SWITCH", "expression": "${(child_workflow_1_ref.status == 'FAILED' || child_workflow_1_ref.status == 'COMPLETED_WITH_ERRORS') || (child_workflow_2_ref.status == 'FAILED' || child_workflow_2_ref.status == 'COMPLETED_WITH_ERRORS')}", "defaultCase": [ { "name": "mark_parent_failed", "taskReferenceName": "mark_parent_failed", "type": "FAIL", "inputParameters": { "message": "At least one sub-workflow failed execution" } } ], "cases": { "false": [] } }
逻辑说明
continueOnFailure: true:确保单个子流失败不会中断其他并行分支的执行,所有子工作流都会运行完毕- JOIN任务:等待所有分支的子工作流执行完成后,再进入后续的状态判断
- SWITCH+FAIL组合:根据子流的最终状态,决定父工作流是正常完成还是标记为失败,替代了
optional标记导致父流始终成功的问题
内容的提问来源于stack exchange,提问作者mkleint
相关产品推荐
相关产品推荐

