package task import ( "context" "encoding/json" "fmt" "github.com/hibiken/asynq" "go.uber.org/zap" ) // ArticlePublisher 文章发布接口 type ArticlePublisher interface { PublishArticleByID(ctx context.Context, articleID string) error } // ArticleTaskHandler 文章任务处理器 type ArticleTaskHandler struct { publisher ArticlePublisher logger *zap.Logger } // NewArticleTaskHandler 创建文章任务处理器 func NewArticleTaskHandler( publisher ArticlePublisher, logger *zap.Logger, ) *ArticleTaskHandler { return &ArticleTaskHandler{ publisher: publisher, logger: logger, } } // HandleArticlePublish 处理文章定时发布任务 func (h *ArticleTaskHandler) HandleArticlePublish(ctx context.Context, t *asynq.Task) error { var payload map[string]interface{} if err := json.Unmarshal(t.Payload(), &payload); err != nil { h.logger.Error("解析任务载荷失败", zap.Error(err)) return fmt.Errorf("解析任务载荷失败: %w", err) } articleID, ok := payload["article_id"].(string) if !ok { h.logger.Error("任务载荷中缺少文章ID") return fmt.Errorf("任务载荷中缺少文章ID") } // 执行文章发布 if err := h.publisher.PublishArticleByID(ctx, articleID); err != nil { h.logger.Error("定时发布文章失败", zap.String("article_id", articleID), zap.Error(err)) return fmt.Errorf("定时发布文章失败: %w", err) } h.logger.Info("定时发布文章成功", zap.String("article_id", articleID)) return nil }