59 lines
1.8 KiB
Go
59 lines
1.8 KiB
Go
package task
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
|
)
|
|
|
|
const (
|
|
ParamsDelayDuration = "delay_duration"
|
|
)
|
|
|
|
// DelayTask 是一个用于模拟延迟的 Task 实现
|
|
type DelayTask struct {
|
|
executionTask *models.TaskExecutionLog
|
|
duration time.Duration
|
|
logger *logs.Logger
|
|
}
|
|
|
|
// Execute 执行延迟任务,等待指定的时间
|
|
func (d *DelayTask) Execute() error {
|
|
d.logger.Infof("任务 %v: 开始延迟 %v...", d.executionTask.TaskID, d.duration)
|
|
time.Sleep(d.duration)
|
|
d.logger.Infof("任务 %v: 延迟结束。", d.executionTask.TaskID)
|
|
return nil
|
|
}
|
|
|
|
func (d *DelayTask) ParseParams(logger *logs.Logger, executionTask *models.TaskExecutionLog) error {
|
|
d.logger = logger
|
|
d.executionTask = executionTask
|
|
|
|
if d.executionTask.Task.Parameters == nil {
|
|
d.logger.Errorf("任务 %v: 缺少参数", d.executionTask.TaskID)
|
|
return fmt.Errorf("任务 %v: 参数不全", d.executionTask.TaskID)
|
|
}
|
|
|
|
var params map[string]interface{}
|
|
if err := json.Unmarshal(d.executionTask.Task.Parameters, ¶ms); err != nil {
|
|
d.logger.Errorf("任务 %v: 解析参数失败: %v", d.executionTask.TaskID, err)
|
|
return fmt.Errorf("任务 %v: 解析参数失败: %v", d.executionTask.TaskID, err)
|
|
}
|
|
|
|
duration, ok := params[ParamsDelayDuration].(float64)
|
|
if !ok {
|
|
d.logger.Errorf("任务 %v: 参数 %v 不是数字或不存在", d.executionTask.TaskID, ParamsDelayDuration)
|
|
return fmt.Errorf("任务 %v: 参数 %v 不是数字或不存在", d.executionTask.TaskID, ParamsDelayDuration)
|
|
}
|
|
|
|
d.duration = time.Duration(duration) * time.Second
|
|
return nil
|
|
}
|
|
|
|
func (d *DelayTask) OnFailure(executeErr error) {
|
|
d.logger.Errorf("任务 %v: 执行失败: %v", d.executionTask.TaskID, executeErr)
|
|
}
|