JCC-CSScheduler/executor/internal/manager/manager.go

75 lines
1.6 KiB
Go

package manager
import (
"fmt"
"gitlink.org.cn/cloudream/common/pkgs/logger"
"gitlink.org.cn/cloudream/common/utils/reflect2"
exectsk "gitlink.org.cn/cloudream/scheduler/common/pkgs/mq/executor/task"
"gitlink.org.cn/cloudream/scheduler/executor/internal/task"
"sync"
)
type Manager struct {
statusChans []*task.TaskChan[any]
Tasks map[string]*task.Task
ctx task.TaskContext
lock sync.Mutex
}
func NewManager() Manager {
return Manager{
statusChans: make([]*task.TaskChan[any], 0),
Tasks: make(map[string]*task.Task),
ctx: task.TaskContext{},
}
}
func (m *Manager) GetTaskChan() *task.TaskChan[any] {
// 创建 TaskChan[any] 实例,并赋值 UnboundChannel[any]
taskChan := task.NewTaskChan[any]()
m.statusChans = append(m.statusChans, taskChan)
return taskChan
}
func (m *Manager) sendTaskChan(tskChan task.TaskChan[any]) {
for {
receive, err := tskChan.Chan.Receive()
if err != nil {
logger.Error(err.Error())
continue
}
for i := 0; i < len(m.statusChans); i++ {
err := m.statusChans[i].Chan.Send(receive)
if err != nil {
logger.Error(err.Error())
continue
}
}
}
}
func (m *Manager) StartByInfo(taskID string, info exectsk.TaskInfo) (*task.Task, error) {
m.lock.Lock()
defer m.lock.Unlock()
infoType := reflect2.TypeOfValue(info)
ctor, ok := task.TaskFromInfoCtors[infoType]
if !ok {
return nil, fmt.Errorf("unknow info type")
}
newTask := task.NewTask(taskID)
m.Tasks[taskID] = newTask
go ctor(info).Execute(newTask, m.ctx)
// 将task的状态发送到所有channel
go m.sendTaskChan(newTask.TaskStatusChan)
return newTask, nil
}