diff --git a/business/jxutils/tasksch/parallel_task.go b/business/jxutils/tasksch/parallel_task.go index 50b30da1b..f99361328 100644 --- a/business/jxutils/tasksch/parallel_task.go +++ b/business/jxutils/tasksch/parallel_task.go @@ -186,6 +186,5 @@ func (task *ParallelTask) Run() { } func (t *ParallelTask) AddChild(task ITask) ITask { - task.SetParent(t) return t.BaseTask.AddChild(task) } diff --git a/business/jxutils/tasksch/sequence_task.go b/business/jxutils/tasksch/sequence_task.go index 1ab500466..bd25d425c 100644 --- a/business/jxutils/tasksch/sequence_task.go +++ b/business/jxutils/tasksch/sequence_task.go @@ -69,6 +69,5 @@ func (task *SeqTask) Run() { } func (t *SeqTask) AddChild(task ITask) ITask { - task.SetParent(t) return t.BaseTask.AddChild(task) } diff --git a/business/jxutils/tasksch/task.go b/business/jxutils/tasksch/task.go index b992f1981..89f407e4a 100644 --- a/business/jxutils/tasksch/task.go +++ b/business/jxutils/tasksch/task.go @@ -63,6 +63,7 @@ type ITask interface { // GetDetailErrList() []error GetLeafResult() (finishedItemCount, failedItemCount int) AddBatchErr(err error) + AddFailedList(failedList ...interface{}) GetFailedList() (failedList []interface{}) SetFinishHook(func(task ITask)) @@ -247,6 +248,8 @@ func (t *BaseTask) GetStatus() int { } func (t *BaseTask) AddChild(task ITask) ITask { + task.SetParent(t) + t.locker.Lock() defer t.locker.Unlock() @@ -368,22 +371,41 @@ func (t *BaseTask) SetFinishHook(hook func(task ITask)) { t.finishHook = hook } +// 此函数非线程安全,只能在确定任务结束后调用 func (t *BaseTask) GetFailedList() (failedList []interface{}) { - t.locker.RLock() - failedList = append(failedList, t.FailedList...) - t.locker.RUnlock() + // t.locker.RLock() + // failedList = append(failedList, t.FailedList...) + // t.locker.RUnlock() - for _, v := range t.Children { - failedList = append(failedList, v.GetFailedList()...) - } - return failedList + // for _, v := range t.Children { + // failedList = append(failedList, v.GetFailedList()...) + // } + // return failedList + + // t.locker.RLock() + // defer t.locker.RUnlock() + // if len(t.FailedList) > 0 { + // failedList = make([]interface{}, len(t.FailedList)) + // copy(failedList, t.FailedList) + // } + // return failedList + + return t.FailedList } func (t *BaseTask) AddFailedList(failedList ...interface{}) { if len(failedList) > 0 { - t.locker.Lock() - defer t.locker.Unlock() - t.FailedList = append(t.FailedList, failedList...) + // t.locker.Lock() + // defer t.locker.Unlock() + // t.FailedList = append(t.FailedList, failedList...) + + if t.parent == nil || t.finishHook != nil { + t.locker.Lock() + defer t.locker.Unlock() + t.FailedList = append(t.FailedList, failedList...) + } else { + t.parent.AddFailedList(failedList...) + } } }