80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
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
|
|
}
|