任务

  • 🐬任务定义基本操作
  • 🐠基本操作
  • 🐟创建任务
  • 🐡源码
  • 🐟修改 查询 删除
  • 🐟移动 版本
  • 🐬任务实例
  • 🐠强制成功
  • 🐠日志查看下载
  • 🐟日志查看
  • 🐟日志下载


🔼上一集:dolphinscheduler 3.0.1 项目管理(二):工作流实例

*️⃣主目录:dolphinscheduler 3.0.1功能梳理及源码解读

🔽下一集:dolphinscheduler 3.0.1 项目管理(三):资源中心


1.0的时候,工作流定义就对应一个json串,存在一个字段中,2.0开始就分开了,工作流定义和任务定义、外加一张关系表三张表,3.0的时候前端把任务也单独拎出来了,创建了单独的菜单,增加了任务定义等功能,通篇看下来,不要问我星星有几颗,确实bug很多很多


🐬任务定义基本操作


🐠基本操作


🐟创建任务


增加了任务组,组内优先级

dolphin schedler 架构 dolphin program_前端


但是任务组(资源中心再详聊)还创建不了,净整花里胡哨的

dolphin schedler 架构 dolphin program_在线日志_02


dolphin schedler 架构 dolphin program_基本操作_03


dolphin schedler 架构 dolphin program_dolphin schedler 架构_04

海豚调度更新迭代是块,所以bug产量也多,本地启动ui,和虚拟机上的效果还不一样!!!

dolphin schedler 架构 dolphin program_前端_05


dolphin schedler 架构 dolphin program_前端_06


效果如下:

dolphin schedler 架构 dolphin program_前端_07

🐡源码

TaskDefinitionController.createTaskBindsWorkFlow()
TaskDefinitionServiceImpl.createTaskBindsWorkFlow()

dolphin schedler 架构 dolphin program_下载_08


dolphin schedler 架构 dolphin program_在线日志_09

其实就登记两/四(log表)张表,登记任务定义表t_ds_task_definition和工作流任务关系表t_ds_process_task_relation(关联的key是code + version,任务的前置节点为空时,对应的pre_task_node和pre_task_version为0)

dolphin schedler 架构 dolphin program_前端_10


t_ds_process_task_relation的作用还是比较大的,构建DAG,工作流依次执行,包括前面文章提到的节点运行,向后、向前,都离不开这张表

dolphin schedler 架构 dolphin program_基本操作_11

dolphin schedler 架构 dolphin program_基本操作_12

🐟修改 查询 删除


  • 修改:只允许修改内容,不允许修改工作流、前置任务(bug 数据不显示),所以就是简单的任务定义表更新

    本地启动UI,只有工作流不允许修改,前置任务数据也不显示,bug何其多
  • 查询:查询任务定义表,增加判断是否有上游任务并传入上游信息
  • 删除:只能删除没有依赖关系的节点,删除关系表(前置节点0),删除任务定义表,理论是这样


    实际上又是个bug,删除新增的任务,对应的工作流之前的节点也不显示了,被删除了还是关联关系中断了?有兴趣自己研究吧(内心MMP,更新这么快搞什么,都是bug!!!)

🐟移动 版本


  • 移动报错:405 Method Not Allowed,对应ProcessTaskRelationController,没有该方法

    看了最新代码也没有该方法,看页面,如果移动只传一个工作流名称,那只能移动没有关联关系的节点,比如说上面定义的addTask-local,依赖三个上游节点,其它工作流肯定没有这三个节点,所以移动的时候要页面加个前置任务,除了更新定义表、登记关系表,还要删除之前的关系表中的数据
  • 版本
    下线的任务也无法编辑,找下现有的数据吧

dolphin schedler 架构 dolphin program_基本操作_13


不见了!!!!!

dolphin schedler 架构 dolphin program_dolphin schedler 架构_14


dolphin schedler 架构 dolphin program_dolphin schedler 架构_15

🐬任务实例


🐠强制成功


只有失败的任务节点可以强制成功

dolphin schedler 架构 dolphin program_dolphin schedler 架构_16


dolphin schedler 架构 dolphin program_基本操作_17


dolphin schedler 架构 dolphin program_在线日志_18

唯一能想到的使用场景就是依赖节点,比如定义任务D,依赖工作流shell的A节点,A节点先执行,失败了,后面执行D的时候也会失败,假如这一次不需要考虑A的结果,希望D能够正常执行,那么A失败后,紧接着强制成功,那么D将正常执行下去。总感觉很鸡肋?不知道真正的使用场景是什么

dolphin schedler 架构 dolphin program_在线日志_19

🐠日志查看下载


3.0日志下载按钮单独拎出来了

dolphin schedler 架构 dolphin program_在线日志_20


dolphin schedler 架构 dolphin program_前端_21

🐟日志查看


dolphin schedler 架构 dolphin program_dolphin schedler 架构_22

LoggerController.queryLog()
LoggerServiceImpl.queryLog()

和前面文章介绍的删除日志流程一样,发送指令获取响应

dolphin schedler 架构 dolphin program_基本操作_23

🐟日志下载


LoggerController.downloadTaskLog()
LoggerServiceImpl.queryLog()
import org.springframework.http.ResponseEntity;
public ResponseEntity downloadTaskLog(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
                                      @RequestParam(value = "taskInstanceId") int taskInstanceId) {
    byte[] logBytes = loggerService.getLogBytes(taskInstanceId);
    return ResponseEntity
        .ok()
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + System.currentTimeMillis() + ".log" + "\"")
        .body(logBytes);
}

System.getProperty("line.separator")获取操作系统对应的换行符,比如:

  • windows:\r\n
  • linux/unix:\r
  • Mac:\n
private byte[] getLogBytes(TaskInstance taskInstance) {
    Host host = Host.of(taskInstance.getHost());
    byte[] head = String.format(LOG_HEAD_FORMAT, taskInstance.getLogPath(), host,System.getProperty("line.separator")).getBytes(StandardCharsets.UTF_8);
    return Bytes.concat(head,logClient.getLogBytes(host.getIp(), host.getPort(), taskInstance.getLogPath()));
}