1.0的时候,工作流定义就对应一个json串,存在一个字段中,2.0开始就分开了,工作流定义和任务定义、外加一张关系表三张表,3.0的时候前端把任务也单独拎出来了,创建了单独的菜单,增加了任务定义等功能,通篇看下来,不要问我星星有几颗,确实bug很多很多
🐬任务定义基本操作
🐠基本操作
🐟创建任务
增加了任务组,组内优先级
但是任务组(资源中心再详聊)还创建不了,净整花里胡哨的
海豚调度更新迭代是块,所以bug产量也多,本地启动ui,和虚拟机上的效果还不一样!!!
效果如下:
🐡源码
TaskDefinitionController.createTaskBindsWorkFlow()
TaskDefinitionServiceImpl.createTaskBindsWorkFlow()
其实就登记两/四(log表)张表,登记任务定义表t_ds_task_definition
和工作流任务关系表t_ds_process_task_relation
(关联的key是code + version,任务的前置节点为空时,对应的pre_task_node和pre_task_version为0)
t_ds_process_task_relation的作用还是比较大的,构建DAG,工作流依次执行,包括前面文章提到的节点运行,向后、向前,都离不开这张表
🐟修改 查询 删除
- 修改:只允许修改内容,不允许修改工作流、前置任务(bug 数据不显示),所以就是简单的任务定义表更新
本地启动UI,只有工作流不允许修改,前置任务数据也不显示,bug何其多
- 查询:查询任务定义表,增加判断是否有上游任务并传入上游信息
- 删除:只能删除没有依赖关系的节点,删除关系表(前置节点0),删除任务定义表,理论是这样
实际上又是个bug,删除新增的任务,对应的工作流之前的节点也不显示了,被删除了还是关联关系中断了?有兴趣自己研究吧(内心MMP,更新这么快搞什么,都是bug!!!)
🐟移动 版本
- 移动报错:
405 Method Not Allowed
,对应ProcessTaskRelationController
,没有该方法
看了最新代码也没有该方法,看页面,如果移动只传一个工作流名称,那只能移动没有关联关系的节点,比如说上面定义的addTask-local,依赖三个上游节点,其它工作流肯定没有这三个节点,所以移动的时候要页面加个前置任务,除了更新定义表、登记关系表,还要删除之前的关系表中的数据
- 版本
下线的任务也无法编辑,找下现有的数据吧
不见了!!!!!
🐬任务实例
🐠强制成功
只有失败的任务节点可以强制成功
唯一能想到的使用场景就是依赖节点,比如定义任务D,依赖工作流shell的A节点,A节点先执行,失败了,后面执行D的时候也会失败,假如这一次不需要考虑A的结果,希望D能够正常执行,那么A失败后,紧接着强制成功,那么D将正常执行下去。总感觉很鸡肋?不知道真正的使用场景是什么
🐠日志查看下载
3.0日志下载按钮单独拎出来了
🐟日志查看
LoggerController.queryLog()
LoggerServiceImpl.queryLog()
和前面文章介绍的删除日志流程一样,发送指令获取响应
🐟日志下载
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()));
}
最后给大家分享一段代码,保证认识字的人都能看懂:
if("写的还凑合"){
"请右下角点👍"
} else if("写的不错") {
"请右下角点⭐收藏,没事就可以回味回味!"
} else {
"请右下角点💬,接受夸赞,反对批评!"
"当然有问题,热烈🌞欢迎🎈指正🙇♂️!"
}