增加任务运行的方法

This commit is contained in:
白茶清欢 2022-06-23 16:46:22 +08:00
parent 30b6fa4c46
commit a7552c210d
3 changed files with 47 additions and 6 deletions

View File

@ -19,6 +19,8 @@ type ITask interface {
Name() string
// Description 任务描述
Description() string
// GetRunID 获取任务ID
GetRunID() string
// Callback 任务执行的回调
Callback(result *Result) error
// Execute 执行任务

View File

@ -15,8 +15,6 @@ package task
type Config struct {
// TaskName 执行的任务名称
TaskName string
// GetRunID 获取任务运行的ID
GetRunID func() string
// Async 是否异步运行
Async bool
// Timeout 单位 : 秒, <= 0认为不设置超时
@ -39,8 +37,6 @@ type Result struct {
TaskRunID string // 任务运行ID
TaskDescription string // 任务描述
TaskConfig *Config // 任务配置
Async bool // 是否异步
Param map[string]interface{} // 任务参数
Data map[string]interface{} // 任务结果数据
Err error // 异常信息, err == nil , 代表执行成功
}

47
task.go
View File

@ -10,7 +10,9 @@ package task
import (
"context"
"fmt"
"runtime"
"sync"
"time"
)
var (
@ -76,6 +78,47 @@ func (d *dispatch) Remove(taskNameList ...string) error {
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:18 2022/6/23
func (d *dispatch) Run(ctx context.Context, cfg *Config, taskParam map[string]interface{}) (map[string]interface{}, error) {
return nil, nil
func (d *dispatch) Run(ctx context.Context, cfg *Config) *Result {
var (
taskInstance ITask
exist bool
)
result := &Result{
StartTime: time.Now().UnixNano(),
FinishTime: 0,
Used: 0,
TaskRunID: "",
TaskDescription: "",
TaskConfig: cfg,
Data: nil,
Err: nil,
}
defer func() {
result.FinishTime = time.Now().UnixNano()
result.Used = result.FinishTime - result.StartTime
if e := recover(); nil != e {
switch e.(type) {
case runtime.Error: // 运行时错误
result.Err = fmt.Errorf("出现运行时Panic : %v", e)
default: // 非运行时错误
result.Err = fmt.Errorf("出现其他场景Panic : %v", e)
}
}
}()
d.lock.RLock()
if taskInstance, exist = d.taskTable[cfg.TaskName]; !exist {
result.Err = fmt.Errorf("%v 任务未注册", cfg.TaskName)
}
result.TaskRunID = taskInstance.GetRunID()
result.TaskDescription = taskInstance.Description()
if cfg.Async {
// 异步运行
go func() {
result.Data, result.Err = taskInstance.Execute(ctx, cfg)
}()
} else {
result.Data, result.Err = taskInstance.Execute(ctx, cfg)
}
return result
}