package tasksch import ( "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/globals" ) const ( StepBegin = "begin" StepEnd = "End" ) type SeqWorkFunc func(step int, params ...interface{}) (result interface{}, err error) // 只有最后一次返回结果保留 type SeqTask struct { BaseTask worker SeqWorkFunc } func NewSeqTask(taskName string, userName string, worker SeqWorkFunc, stepCount int, params ...interface{}) *SeqTask { task := &SeqTask{ BaseTask: BaseTask{ ParallelCount: 1, params: params, ID: utils.GetUUID(), Name: taskName, CreatedAt: time.Now(), CreatedBy: userName, UpdatedAt: time.Now(), TotalJobCount: stepCount, TotalItemCount: stepCount, quitChan: make(chan int, 1), finishChan: make(chan int, 2), Status: TaskStatusWorking, }, worker: worker, } task.C = task.finishChan return task } func (task *SeqTask) Run() *SeqTask { go func() { globals.SugarLogger.Debugf("Run SeqTask %s", task.Name) var taskErr error var taskResult interface{} for i := 0; i < task.TotalItemCount; i++ { taskResult, taskErr = task.worker(i, task.params...) task.finishedOneJob(1, taskErr) if taskErr != nil { break } } task.locker.Lock() if taskErr != nil { // 如果有错误,肯定就是失败了 task.Status = TaskStatusFailed } else { if task.FinishedJobCount < task.TotalJobCount { taskErr = ErrTaskIsCanceled task.Status = TaskStatusCanceled } else { task.Status = TaskStatusFinished } } task.err = taskErr task.result = taskResult task.TerminatedAt = time.Now() task.locker.Unlock() globals.SugarLogger.Debugf("Run SeqTask %s, result:%v, err:%v", task.Name, taskResult, taskErr) close(task.finishChan) close(task.quitChan) }() return task }