1. 概述
1.1 应用场景
用户创建两个定时任务(调用关系)处理数据,处理后的数据被用于大屏展示。
由于对数据的实时性要求较高,希望任务执行后立刻被拉起,且任务运维界面不希望看到任务出现排队的情况。
1.2 实现思路
问题:
若设置子任务定期执行,子任务会出现排队的情况。
若设置父任务定期执行,通过「调用任务」节点父任务拉起子任务的执行,子任务运行过程中父任务会出现排队的情况。
本文方案:
父任务中,使用内置参数 ${workname.opresult} 判断子任务是否执行成功,若子任务上次运行状态为成功:
调用 基于任务ID运行任务接口,来运行子任务。
执行父任务的后续节点。
运行情况为:子任务运行成功→父任务到达运行时间判断子任务上次运行是否成功,若运行成功:运行子任务、运行父任务→子任务运行成功→循环执行
所以,不会出现排队情况。
1.3 注意事项
本文方案适用于 4.0.29 及以上版本。
1.4 任务展示
FineDataLink 中的数据处理过程,详情参见:https://demo.finedatalink.com/ 中的定时任务:「循环往复执行定时任务-父任务」、「循环往复执行定时任务-子任务」
2. 操作步骤
2.1 创建子任务
本节目的:模拟子任务的运行。
1)新建定时任务,拖入「SQL 脚本」节点,SQL 语句为select sleep(20),表示子任务运行 20 秒,用于模拟子任务的运行。用户可根据实际情况构建子任务。如下图所示:
2)保存该任务。
2.2 父任务准备
需要使用 基于任务ID运行任务接口,来运行子任务。
本文示例 FDL 工程为独立部署,参考 FR模板调用定时任务接口示例 文档的 2.1-2.5 节内容。
2.3 创建父任务
父任务中包含的节点及作用如下表所示:
节点 | 说明 |
---|---|
条件分支 | 使用内置参数 ${workname.opresult} 判断子任务是否执行成功,若子任务执行成功,开始执行父任务的后续节点 |
数据转换 | 调用 基于任务ID运行任务接口,来运行子任务 |
1)新建一个定时任务,拖入「条件分支」节点,使用内置参数 ${workname.opresult} 判断子任务是否执行成功,若子任务执行成功,开始执行后续节点。
再拖入一个「数据转换」节点。如下图所示:
2)进入「数据转换」节点,拖入「API输入」算子,调用 基于任务ID运行任务接口,来运行子任务。如下图所示:
3)拖入「参数输出」算子,将 status 列输出。如下图所示:
本节步骤作用:「数据转换」节点内只有「API输入」算子将会报错,需要设置一个输出算子,本步骤输出的参数无意义。
4)点击右上角「保存」按钮。
5)为父任务设置定时调度,每分钟执行一次父任务。如下图所示:
2.4 后续步骤
用户可在父任务的「数据转换」节点后,拖入节点进行数据的处理。
2.5 效果查看
先手动运行下子任务,后续效果如下图所示:
父任务和子任务不存在排队情况: