第一版时间轮任务调度实现 #1
@ -15,8 +15,8 @@ import "context"
|
|||||||
//
|
//
|
||||||
// Date : 14:22 2022/6/23
|
// Date : 14:22 2022/6/23
|
||||||
type ITask interface {
|
type ITask interface {
|
||||||
// Name 任务名称标识, 全局唯一
|
// GetFlag 任务名称标识, 全局唯一
|
||||||
Name() string
|
GetFlag() string
|
||||||
// Description 任务描述
|
// Description 任务描述
|
||||||
Description() string
|
Description() string
|
||||||
// GetRunID 获取任务ID
|
// GetRunID 获取任务ID
|
||||||
@ -24,5 +24,5 @@ type ITask interface {
|
|||||||
// Callback 任务执行成功的回调
|
// Callback 任务执行成功的回调
|
||||||
Callback(result *Result) error
|
Callback(result *Result) error
|
||||||
// Execute 执行任务
|
// Execute 执行任务
|
||||||
Execute(ctx context.Context, cfg *Config) *Result
|
Execute(ctx context.Context, cfg *Config) (map[string]interface{}, error)
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,8 @@ type Config struct {
|
|||||||
ForbiddenCallback bool
|
ForbiddenCallback bool
|
||||||
// Param 任务执行参数
|
// Param 任务执行参数
|
||||||
Param map[string]interface{}
|
Param map[string]interface{}
|
||||||
|
// TaskFlag 任务标识
|
||||||
|
TaskFlag string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Result 执行结果
|
// Result 执行结果
|
||||||
|
37
task.go
37
task.go
@ -51,10 +51,10 @@ func (d *dispatch) Register(taskInstanceList ...ITask) error {
|
|||||||
if nil == taskInstance {
|
if nil == taskInstance {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if _, exist := d.taskTable[taskInstance.Name()]; exist {
|
if _, exist := d.taskTable[taskInstance.GetFlag()]; exist {
|
||||||
return fmt.Errorf("%s 任务重复注册! ", taskInstance.Name())
|
return fmt.Errorf("%s 任务重复注册! ", taskInstance.GetFlag())
|
||||||
}
|
}
|
||||||
d.taskTable[taskInstance.Name()] = taskInstance
|
d.taskTable[taskInstance.GetFlag()] = taskInstance
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -109,36 +109,31 @@ func (d *dispatch) Run(ctx context.Context, cfg *Config) *Result {
|
|||||||
TaskConfig: cfg,
|
TaskConfig: cfg,
|
||||||
Data: nil,
|
Data: nil,
|
||||||
Err: nil,
|
Err: nil,
|
||||||
Async: cfg.Async,
|
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
result.FinishTime = time.Now().UnixNano()
|
result.FinishTime = time.Now().UnixNano()
|
||||||
result.Used = result.FinishTime - result.StartTime
|
result.Used = result.FinishTime - result.StartTime
|
||||||
}()
|
}()
|
||||||
d.lock.RLock()
|
d.lock.RLock()
|
||||||
if taskInstance, exist = d.taskTable[cfg.TaskName]; !exist {
|
if taskInstance, exist = d.taskTable[cfg.TaskFlag]; !exist {
|
||||||
result.Err = fmt.Errorf("%v 任务未注册", cfg.TaskName)
|
result.Err = fmt.Errorf("%v 任务未注册", cfg.TaskFlag)
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
d.lock.RUnlock()
|
d.lock.RUnlock()
|
||||||
result.TaskRunID = taskInstance.GetRunID()
|
result.TaskRunID = taskInstance.GetRunID()
|
||||||
result.TaskDescription = taskInstance.Description()
|
result.TaskDescription = taskInstance.Description()
|
||||||
if cfg.Async {
|
// 异步运行
|
||||||
// 异步运行
|
go func() {
|
||||||
go func() {
|
if e := recover(); nil != e {
|
||||||
if e := recover(); nil != e {
|
switch e.(type) {
|
||||||
switch e.(type) {
|
case runtime.Error: // 运行时错误
|
||||||
case runtime.Error: // 运行时错误
|
result.Err = fmt.Errorf("出现运行时Panic : %v", e)
|
||||||
result.Err = fmt.Errorf("出现运行时Panic : %v", e)
|
default: // 非运行时错误
|
||||||
default: // 非运行时错误
|
result.Err = fmt.Errorf("出现其他场景Panic : %v", e)
|
||||||
result.Err = fmt.Errorf("出现其他场景Panic : %v", e)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
result.Data, result.Err = taskInstance.Execute(ctx, cfg)
|
}
|
||||||
_ = taskInstance.Callback(result)
|
|
||||||
}()
|
|
||||||
} else {
|
|
||||||
result.Data, result.Err = taskInstance.Execute(ctx, cfg)
|
result.Data, result.Err = taskInstance.Execute(ctx, cfg)
|
||||||
_ = taskInstance.Callback(result)
|
_ = taskInstance.Callback(result)
|
||||||
}
|
}()
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user