这是我贴出的实现方法,需要将原本的DoPrecheck的地方换成ShouldSkip,内部逻辑是先做DoPrecheck,如果阻塞,直接阻塞【状态在函数内部被更新为block】,如果skip直接返回,状态也被函数自动更新,再进行放行的前置节点检查(success或skip),其中只要有success,那么本节点也应该success。
调用shouldSkip的时候,先判断taskstatus有没有因为调用了doprecheck被设置成了skip或者success,然后再根据ShouldSkip的返回值来判断,yes就是skip,no就是success。
func (t *TaskInstance) ShouldSkip(dagIns *DagInstance) bool {
if t.PreChecks != nil {
if ok, _ := t.DoPreCheck(dagIns); ok {
return t.Status == TaskInstanceStatusSkipped
}
}
// 自动判断前置 skip 传播
allSkipped := true
for _, depID := range t.DependOn {
dep := dagIns.GetTaskInstanceByID(depID)
if dep.Status != TaskInstanceStatusSkipped {
allSkipped = false
break
}
}
return allSkipped
}
这是我贴出的实现方法,需要将原本的DoPrecheck的地方换成ShouldSkip,内部逻辑是先做DoPrecheck,如果阻塞,直接阻塞【状态在函数内部被更新为block】,如果skip直接返回,状态也被函数自动更新,再进行放行的前置节点检查(success或skip),其中只要有success,那么本节点也应该success。
调用shouldSkip的时候,先判断taskstatus有没有因为调用了doprecheck被设置成了skip或者success,然后再根据ShouldSkip的返回值来判断,yes就是skip,no就是success。