Files
pig-farm-controller/internal/app/service/task/delay_task.go
2025-09-17 16:55:56 +08:00

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: 延迟结束。\n", 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, &params); 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)
return nil
}
func (d *DelayTask) OnFailure(executeErr error) {
d.logger.Errorf("任务 %v: 执行失败: %v", d.executionTask.TaskID, executeErr)
}