75 lines
1.6 KiB
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
|
|
}
|