This commit is contained in:
2025-09-02 20:46:10 +08:00
parent d73659fed3
commit c579e53ad1
2 changed files with 17 additions and 20 deletions

View File

@@ -26,12 +26,9 @@ func (cmd *SchedulePublishCommand) GetScheduledTime() (time.Time, error) {
} }
for _, format := range formats { for _, format := range formats {
if t, err := time.Parse(format, cmd.ScheduledTime); err == nil { if t, err := time.ParseInLocation(format, cmd.ScheduledTime, cst); err == nil {
// 如果解析的时间没有时区信息,则设置为中国东八 // 确保返回的时间是东八区时
if t.Location() == time.UTC { return t.In(cst), nil
t = t.In(cst)
}
return t, nil
} }
} }

View File

@@ -35,42 +35,42 @@ func (c *AsynqClient) ScheduleArticlePublish(ctx context.Context, articleID stri
payload := map[string]interface{}{ payload := map[string]interface{}{
"article_id": articleID, "article_id": articleID,
} }
payloadBytes, err := json.Marshal(payload) payloadBytes, err := json.Marshal(payload)
if err != nil { if err != nil {
c.logger.Error("序列化任务载荷失败", zap.Error(err)) c.logger.Error("序列化任务载荷失败", zap.Error(err))
return "", fmt.Errorf("创建任务失败: %w", err) return "", fmt.Errorf("创建任务失败: %w", err)
} }
task := asynq.NewTask(TaskTypeArticlePublish, payloadBytes) task := asynq.NewTask(TaskTypeArticlePublish, payloadBytes)
// 计算延迟时间 // 计算延迟时间
delay := publishTime.Sub(time.Now()) delay := publishTime.Sub(time.Now())
if delay <= 0 { if delay <= 0 {
return "", fmt.Errorf("定时发布时间不能早于当前时间") return "", fmt.Errorf("定时发布时间不能早于当前时间")
} }
// 设置任务选项 // 设置任务选项
opts := []asynq.Option{ opts := []asynq.Option{
asynq.ProcessIn(delay), asynq.ProcessIn(delay),
asynq.MaxRetry(3), asynq.MaxRetry(3),
asynq.Timeout(5 * time.Minute), asynq.Timeout(5 * time.Minute),
} }
info, err := c.client.Enqueue(task, opts...) info, err := c.client.Enqueue(task, opts...)
if err != nil { if err != nil {
c.logger.Error("调度定时发布任务失败", c.logger.Error("调度定时发布任务失败",
zap.String("article_id", articleID), zap.String("article_id", articleID),
zap.Time("publish_time", publishTime), zap.Time("publish_time", publishTime),
zap.Error(err)) zap.Error(err))
return "", fmt.Errorf("调度任务失败: %w", err) return "", fmt.Errorf("调度任务失败: %w", err)
} }
c.logger.Info("定时发布任务调度成功", c.logger.Info("定时发布任务调度成功",
zap.String("article_id", articleID), zap.String("article_id", articleID),
zap.Time("publish_time", publishTime), zap.Time("publish_time", publishTime),
zap.String("task_id", info.ID)) zap.String("task_id", info.ID))
return info.ID, nil return info.ID, nil
} }
@@ -80,12 +80,12 @@ func (c *AsynqClient) CancelScheduledTask(ctx context.Context, taskID string) er
// 这里我们记录日志,实际取消需要在数据库中标记 // 这里我们记录日志,实际取消需要在数据库中标记
c.logger.Info("请求取消定时任务", c.logger.Info("请求取消定时任务",
zap.String("task_id", taskID)) zap.String("task_id", taskID))
// 在实际应用中,你可能需要: // 在实际应用中,你可能需要:
// 1. 在数据库中标记任务为已取消 // 1. 在数据库中标记任务为已取消
// 2. 在任务执行时检查取消状态 // 2. 在任务执行时检查取消状态
// 3. 或者使用Redis的TTL机制 // 3. 或者使用Redis的TTL机制
return nil return nil
} }
@@ -93,22 +93,22 @@ func (c *AsynqClient) CancelScheduledTask(ctx context.Context, taskID string) er
func (c *AsynqClient) RescheduleArticlePublish(ctx context.Context, articleID string, oldTaskID string, newPublishTime time.Time) (string, error) { func (c *AsynqClient) RescheduleArticlePublish(ctx context.Context, articleID string, oldTaskID string, newPublishTime time.Time) (string, error) {
// 1. 取消旧任务(标记为已取消) // 1. 取消旧任务(标记为已取消)
if err := c.CancelScheduledTask(ctx, oldTaskID); err != nil { if err := c.CancelScheduledTask(ctx, oldTaskID); err != nil {
c.logger.Warn("取消旧任务失败", c.logger.Warn("取消旧任务失败",
zap.String("old_task_id", oldTaskID), zap.String("old_task_id", oldTaskID),
zap.Error(err)) zap.Error(err))
} }
// 2. 创建新任务 // 2. 创建新任务
newTaskID, err := c.ScheduleArticlePublish(ctx, articleID, newPublishTime) newTaskID, err := c.ScheduleArticlePublish(ctx, articleID, newPublishTime)
if err != nil { if err != nil {
return "", fmt.Errorf("重新调度任务失败: %w", err) return "", fmt.Errorf("重新调度任务失败: %w", err)
} }
c.logger.Info("重新调度定时发布任务成功", c.logger.Info("重新调度定时发布任务成功",
zap.String("article_id", articleID), zap.String("article_id", articleID),
zap.String("old_task_id", oldTaskID), zap.String("old_task_id", oldTaskID),
zap.String("new_task_id", newTaskID), zap.String("new_task_id", newTaskID),
zap.Time("new_publish_time", newPublishTime)) zap.Time("new_publish_time", newPublishTime))
return newTaskID, nil return newTaskID, nil
} }