forked from JointCloud/JCC-CSScheduler
60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package task
|
||
|
||
import (
|
||
"fmt"
|
||
"reflect"
|
||
|
||
"gitlink.org.cn/cloudream/common/pkgs/task"
|
||
myreflect "gitlink.org.cn/cloudream/common/utils/reflect"
|
||
reporter "gitlink.org.cn/cloudream/scheduler/advisor/internal/reporter"
|
||
"gitlink.org.cn/cloudream/scheduler/advisor/internal/scheduler"
|
||
advtsk "gitlink.org.cn/cloudream/scheduler/common/pkgs/mq/advisor/task"
|
||
)
|
||
|
||
type TaskContext struct {
|
||
reporter *reporter.Reporter
|
||
scheduleSvc *scheduler.Service
|
||
}
|
||
|
||
// 需要在Task结束后主动调用,completing函数将在Manager加锁期间被调用,
|
||
// 因此适合进行执行结果的设置
|
||
type CompleteFn = task.CompleteFn
|
||
|
||
type Manager struct {
|
||
task.Manager[TaskContext]
|
||
}
|
||
|
||
type TaskBody = task.TaskBody[TaskContext]
|
||
|
||
type Task = task.Task[TaskContext]
|
||
|
||
type CompleteOption = task.CompleteOption
|
||
|
||
func NewManager(reporter *reporter.Reporter, scheduleSvc *scheduler.Service) Manager {
|
||
return Manager{
|
||
Manager: task.NewManager(TaskContext{
|
||
reporter: reporter,
|
||
scheduleSvc: scheduleSvc,
|
||
}),
|
||
}
|
||
}
|
||
|
||
func (m *Manager) StartByInfo(info advtsk.TaskInfo) (*Task, error) {
|
||
infoType := myreflect.TypeOfValue(info)
|
||
|
||
ctor, ok := taskFromInfoCtors[infoType]
|
||
if !ok {
|
||
return nil, fmt.Errorf("unknow info type")
|
||
}
|
||
|
||
return m.StartNew(ctor(info)), nil
|
||
}
|
||
|
||
var taskFromInfoCtors map[reflect.Type]func(advtsk.TaskInfo) TaskBody = make(map[reflect.Type]func(advtsk.TaskInfo) task.TaskBody[TaskContext])
|
||
|
||
func Register[TInfo advtsk.TaskInfo, TTaskBody TaskBody](ctor func(info TInfo) TTaskBody) {
|
||
taskFromInfoCtors[myreflect.TypeOf[TInfo]()] = func(info advtsk.TaskInfo) TaskBody {
|
||
return ctor(info.(TInfo))
|
||
}
|
||
}
|