Apache DolphinScheduler Switch 条件分支任务:用表达式驱动工作流动态流转
Apache DolphinScheduler Switch 条件分支任务用表达式驱动工作流动态流转【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinschedulerSwitch 是 Apache DolphinScheduler 中的条件判断节点它依据全局变量与上游节点传递参数的值结合用户编写的条件表达式决定工作流接下来执行哪一条下游分支。本文将围绕 Switch 任务的创建方式、条件与分支流转参数、完整实战样例并结合仓库中 Switch 任务的源码实现讲解其表达式评估与分支选择的底层原理。Switch 任务是什么Switch 是一个逻辑判断型任务节点它自身不执行任何实际业务脚本而是充当工作流中的路由开关。运行时Switch 节点读取工作流中可用的参数全局参数、上游任务传递的 OUT 参数逐条评估用户在条件中配置的表达式当某个条件表达式结果为true时工作流跳转到该条件指定的下游分支任务当所有条件都不满足时工作流跳转到分支流转默认分支中指定的任务。原文档说明条件表达式通过javax.script.ScriptEngine.eval语义执行从当前仓库源码看实际实现位于 SwitchTaskUtils.java采用delight.nashornsandbox.NashornSandbox在沙箱环境中执行 JavaScript 表达式并返回布尔结果因此条件写法遵循 JavaScript 表达式语法如比较运算、逻辑运算。Switch 任务在 DAG 中通常配合 Shell、SQL、HTTP 等具体执行类任务使用常见于按业务类型分流按数据规模选择不同处理链路等场景。创建 Switch 任务创建入口与普通任务一致完整路径如下进入项目管理点击项目名称进入项目详情点击工作流定义再点击创建工作流按钮进入 DAG 编辑页面从左侧工具栏中找到 Switch 任务节点图标为 switch.png拖拽到画板中即可完成节点创建重要Switch 任务创建后需要先为其配置上下游依赖关系连线之后才能在下游任务下拉框中配置各条件对应的分支。这是因为分支指向的目标必须以 DAG 中已存在的下游节点为基础。任务参数详解Switch 任务除默认任务参数名称、运行环境、优先级、失败重试、超时告警等通用配置外核心参数只有两个任务参数描述条件可以为 Switch 任务配置多个条件当条件满足时就会执行指定的分支。可以配置多个不同的条件来满足不同的业务。使用字符串判断时需要使用双引号分支流转默认的流转内容。当条件中的内容全部不符合要求时则运行分支流转中指定的分支条件表达式的书写规则结合 SwitchTaskUtils.java 的实现条件表达式有以下规则条件中通过${变量名}引用参数值例如${result} SUCCESS字符串比较时字符串值必须使用双引号源码会先将条件中的单引号自动替换为双引号见 generateContentWithTaskParams替换变量时数值与布尔类型的参数值会被直接拼接进表达式如${count} 100字符串类型参数值会被自动加上双引号包裹见 SwitchTaskUtils.java表达式按 JavaScript 语法求值支持、!、、、、||等运算符。任务样例Switch Shell 实现三分支分流下面以一个 Switch 任务 三个下游 Shell 任务的完整样例演示条件分支的配置与验证过程。创建工作流新建一个 Switch 任务以及下游的三个 Shell 任务Shell 任务本身无特殊要求。Switch 任务必须与下游任务连线、建立依赖关系后才能在下游任务下拉框中进行分支目标的选择。设置条件在 Switch 节点配置中填写条件与分支流转条件 1变量的值为A时执行分支taskA条件 2变量的值为B时执行分支taskB分支流转默认分支以上条件均不满足时执行default。由于 Switch 任务类型不支持配置自定义参数即没有本地 IN 参数入口因此无需像普通任务那样配置 IN 类型的局部变量 X即可直接使用上游节点 OUT 类型输出的变量 X参数传递细节见参数传递。配置全局变量本例中条件使用的变量为全局变量在工作流定义页面点击设置全局添加变量并赋值A配置方式详见全局变量。执行与验证保存并上线工作流手动运行或触发调度后查看执行结果。当全局变量值为A时Switch 节点命中第一个条件下游任务 taskA 被正确执行其余分支保持未运行状态。源码解析Switch 分支选择在 Master 端的执行流程Switch 是典型的逻辑任务由 Master 端直接完成条件评估与分支计算不提交给 Worker 执行。其实现链路由三部分构成。1. 参数模型SwitchParametersSwitchParameters.java 定义了两个关键字段switchResult内部包含dependTaskList条件列表与nextNode默认分支节点 code其中每个条件由 SwitchResultVo.java 表示仅包含condition条件表达式字符串与nextNode该条件命中的分支节点 codenextBranch运行时由 Master 计算得出的最终要执行的分支节点 code运行前为空计算后被写入。参数校验checkParameters要求条件列表与默认分支不能同时为空且每个条件都必须指定nextNode。任务参数由 SwitchLogicTaskChannel.java 反序列化为该模型。2. 分支计算SwitchLogicTaskSwitchLogicTask.java 是核心执行类其start()流程为若条件列表为空直接进入默认分支moveToDefaultBranch并将默认分支节点写入nextBranch否则调用calculateSwitchBranch()从taskExecutionContext.getPrepareParamsMap()获取全局参数从taskInstance.getVarPool()反序列化上游传递的 OUT 参数这就是 Switch 无需配置 IN 局部变量即可直接使用上游输出参数的原因按配置顺序逐条评估条件先用SwitchTaskUtils.generateContentWithTaskParams完成${变量}替换再用SwitchTaskUtils.evaluate求值第一条结果为true的条件即命中break将该条件对应的分支节点写入nextBranch所有条件均未命中时走默认分支最后通过checkIfBranchExist校验计算出的分支节点确实存在于当前 DAG 中随后任务置为成功nextBranch交由工作流执行图驱动后续节点的调度。从该流程可以推断条件按配置顺序优先匹配先配置的条件拥有更高优先级同时分支目标必须在 DAG 中真实存在否则运行时会抛出IllegalArgumentException。3. 表达式评估SwitchTaskUtilsSwitchTaskUtils.java 使用NashornSandbox构建了 JavaScript 求值沙箱并注入Array.prototype.includes的 polyfill 以兼容更多表达式写法evaluate()将表达式求值结果强转为Boolean非true一律视为条件不满足。由于表达式在沙箱中执行相比直接使用ScriptEngine.eval隔离性更强这也是条件参数本质上是 JavaScript 布尔表达式的原因。与其他参数机制的配合Switch 的实用性高度依赖参数体系全局变量在全局参数中定义的 IN 方向变量对整个工作流的所有节点生效是 Switch 条件最常用的数据来源上游参数传递Shell、SQL、Procedure、Python、SubWorkflow、Http 等任务可将 OUT 参数传递给下游详见参数传递Switch 会从任务实例的varPool中直接读取这些参数无需额外声明局部变量参数优先级当同名参数同时来自全局变量与上游传递时遵循参数优先级规则启动参数 本地参数 上游任务传递的参数 全局参数Switch 条件中引用的取值也以此为准。小结Switch 任务以参数 JavaScript 布尔表达式 分支映射三要素完成工作流的动态路由参数决定输入表达式决定判定分支映射决定流向。理解其按序匹配、默认兜底、分支必须存在于 DAG 的语义以及在 Master 端沙箱求值的实现方式即可在 Apache DolphinScheduler 中灵活编排按条件分流的数据工作流。【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考