dolphinscheduler 3.0.1 项目管理(二):工作流实例

本文介绍DolphinScheduler 3.0.1版本中关于工作流实例的查询、编辑、删除等功能,并深入探讨了任务执行管理,包括重跑、停止、暂停等操作的具体实现方式及其源码解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🔼上一集:dolphinscheduler 3.0.1 项目管理(二):工作流定义(下)

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

🔽下一集:dolphinscheduler 3.0.1 项目管理(三):任务

🐬查询编辑删除


  • 查询
    在这里插入图片描述
  • 编辑:工作流实例可以编辑工作流,保存的时候有个是否更新工作流定义,感觉就是为了方便测试,不断修改测试没问题了,勾选更新工作流,实现工作流定义更新,工作流定义无需频繁上下线(只有下线可以修改)
    在这里插入图片描述

🐠删除


从页面看删除工作流实例,会把对应的任务实例也删除掉。删除、批量删除对应两个方法,底层调用的还是同一个方法,分开的原因时批量删除删除失败需要弹出提示,有哪些实例删除失败
在这里插入图片描述

撇了一眼代码发现删除做了不少事情,有一部分感觉还是重复的,其实是针对子流程的,先造数据看一下:
在这里插入图片描述

定义子流程:
在这里插入图片描述
在这里插入图片描述

parentA内定义了两个子节点a1、a2:
在这里插入图片描述
运行parentA,查看任务实例,如下:
在这里插入图片描述

🐟数据结构


查看数据库(删除表数据不在赘述,删除日志后面可以看一下):
在这里插入图片描述

  • 流程实例表t_ds_process_instance产生了三条记录,其中两条是子流程,页面不显示
    在这里插入图片描述
  • 流程实例关系表t_ds_relation_process_instance存放的数据用于处理流程定义中含有子流程的情况:
    • 字段parent_process_instance_id表示含有子流程的主流程实例id
    • 字段process_instance_id表示子流程实例的id
    • 字段parent_task_instance_id表示子流程节点的任务实例id
      在这里插入图片描述
  • 任务实例表t_ds_task_instance,主要就是增加对SUB_PROCESS类型的删除
    在这里插入图片描述

🐟删除源码Netty


  • 删除日志
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    • 页面删除shell3-2-20221011180000686实例后,查看日志是否存在,如下图,日志已删除
      在这里插入图片描述
    • 发送删除日志指令
      在这里插入图片描述
    • 服务端读取处理指令
      在这里插入图片描述
    • 日志请求处理LoggerRequestProcessor
      在这里插入图片描述

🐬执行(重跑、停止、失败重跑等)


  • REPEAT_RUNNING 重跑:新增指令
  • RECOVER_SUSPENDED_PROCESS 恢复暂停:新增指令
  • START_FAILURE_TASK_PROCESS 重跑失败任务(2.0叫恢复失败,即从失败节点开始跑):新增指令
  • STOP 停止:先更新为准备停止状态,然后同删除日志,通过netty传送指令
  • PAUSE 暂停:先更新为准备暂停状态,然后同删除日志,通过netty传送指令
    在这里插入图片描述
    在这里插入图片描述

🐠构建流程实例


其中重跑、恢复失败、恢复暂停是在登记流程实例表的时候做的判断ProcessServiceImpl.constructProcessInstance()
在这里插入图片描述

StartNodeIdList用法见下面:
在这里插入图片描述

🐟右键节点运行


算是漏掉的工作流定义中的功能,主要还是3.0bug太多,之前点击运行,看到没有节点执行栏位了,当时想的是可能默认成只执行当前节点了,现在看来不是
在这里插入图片描述

本地启动前端登录,查看如下:
在这里插入图片描述
在这里插入图片描述
虚拟机地址访问如下:
在这里插入图片描述
在这里插入图片描述

🐡StartNodeIdList

回到主题上,节点右键运行会给参数StartNodeIdList 传入当前任务节点编码。顾名思义,以该节点作为起始节点,查询关系表,组装DAG,进行向前、向后、只执行该节点操作。
上面的恢复失败恢复暂停复用的就是这一块逻辑,将失败或暂停的节点编码作为StartNodeIdList> ,执行向后执行操作。
目前遇到的StartNodeIdList其实就只有一个节点,不知道为什么定义成list。
在这里插入图片描述

🐠停止、暂停


定义一个shell任务,等待sleep 1010秒结束,停止功能是可以的,暂停无效,暂停会等任务执行完
在这里插入图片描述
暂停的情况下,后面可能还需要继续执行,所有要等当前正在执行的任务跑完之后(保证数据完整性),暂停执行后续的节点,增加任务节点,再次验证
在这里插入图片描述
暂停成功
在这里插入图片描述
恢复运行
在这里插入图片描述
在这里插入图片描述

🐟源码


更新准备状态:
在这里插入图片描述
同删除日志,可以找到处理状态事件的类StateEventProcessor
在这里插入图片描述
又回到了worker执行器这里:
在这里插入图片描述

StateEventType type = stateEvent.getTaskInstanceId() == 0 ? StateEventType.PROCESS_STATE_CHANGE : StateEventType.TASK_STATE_CHANGE;

没看到给TaskInstanceId赋值的地方,StateEventType 应该为PROCESS_STATE_CHANGE ,对应WorkflowStateEventHandler处理类,如下:
在这里插入图片描述
暂停就是当前节点跑完之后,流程状态更新为暂停,和停止的唯一区别就是当前节点跑完:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看到一句注释:todo不是后面要做的事情嘛?不过看现象已经实现了,按照注释说的暂停任务不放到completeTaskMap,当只有一个节点的时候processReadyPause()方法返回ExecutionStatus.SUCCESS,而当多个节点时,虽然pauseList依然为空,但是整个流程还没结束,因此返回ExecutionStatus.PAUSE

if (CollectionUtils.isNotEmpty(pauseList)       || processInstance.isBlocked()            || !isComplementEnd()            || readyToSubmitTaskQueue.size() > 0

在这里插入图片描述


最后给大家分享一段代码,保证认识字的人都能看懂:

if("写的还凑合"){
    "请右下角点👍"
} else if("写的不错") {
    "请右下角点⭐收藏,没事就可以回味回味!"
} else {
    "请右下角点💬,接受夸赞,反对批评!"
    "当然有问题,热烈🌞欢迎🎈指正🙇‍♂️!"
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韧小钊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值