68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package task
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"git.huangwc.com/pig/pig-farm-controller/internal/domain/plan"
 | 
						|
	"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
 | 
						|
	"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
 | 
						|
)
 | 
						|
 | 
						|
type DelayTaskParams struct {
 | 
						|
	DelayDuration float64 `json:"delay_duration"`
 | 
						|
}
 | 
						|
 | 
						|
// DelayTask 是一个用于模拟延迟的 Task 实现
 | 
						|
type DelayTask struct {
 | 
						|
	executionTask *models.TaskExecutionLog
 | 
						|
	duration      time.Duration
 | 
						|
	logger        *logs.Logger
 | 
						|
}
 | 
						|
 | 
						|
func NewDelayTask(logger *logs.Logger, executionTask *models.TaskExecutionLog) plan.Task {
 | 
						|
	return &DelayTask{
 | 
						|
		executionTask: executionTask,
 | 
						|
		logger:        logger,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Execute 执行延迟任务,等待指定的时间
 | 
						|
func (d *DelayTask) Execute() error {
 | 
						|
	if err := d.parseParameters(); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	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) parseParameters() error {
 | 
						|
	if d.executionTask.Task.Parameters == nil {
 | 
						|
		d.logger.Errorf("任务 %v: 缺少参数", d.executionTask.TaskID)
 | 
						|
		return fmt.Errorf("任务 %v: 参数不全", d.executionTask.TaskID)
 | 
						|
	}
 | 
						|
 | 
						|
	var params DelayTaskParams
 | 
						|
	err := d.executionTask.Task.ParseParameters(¶ms)
 | 
						|
	if err != nil {
 | 
						|
		d.logger.Errorf("任务 %v: 解析参数失败: %v", d.executionTask.TaskID, err)
 | 
						|
		return fmt.Errorf("任务 %v: 解析参数失败: %v", d.executionTask.TaskID, err)
 | 
						|
	}
 | 
						|
 | 
						|
	if params.DelayDuration <= 0 {
 | 
						|
		d.logger.Errorf("任务 %v: 参数 delay_duration 缺失或无效 (必须大于0)", d.executionTask.TaskID)
 | 
						|
		return fmt.Errorf("任务 %v: 参数 delay_duration 缺失或无效 (必须大于0)", d.executionTask.TaskID)
 | 
						|
	}
 | 
						|
 | 
						|
	d.duration = time.Duration(params.DelayDuration) * time.Second
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *DelayTask) OnFailure(executeErr error) {
 | 
						|
	d.logger.Errorf("任务 %v: 执行失败: %v", d.executionTask.TaskID, executeErr)
 | 
						|
}
 |