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)
 | |
| }
 |