package asynq import ( "context" "time" "github.com/hibiken/asynq" "go.uber.org/zap" "tyapi-server/internal/infrastructure/task/types" ) // AsynqClient Asynq客户端实现 type AsynqClient struct { client *asynq.Client logger *zap.Logger } // NewAsynqClient 创建Asynq客户端 func NewAsynqClient(redisAddr string, logger *zap.Logger) *AsynqClient { client := asynq.NewClient(asynq.RedisClientOpt{Addr: redisAddr}) return &AsynqClient{ client: client, logger: logger, } } // Enqueue 入队任务 func (c *AsynqClient) Enqueue(ctx context.Context, taskType types.TaskType, payload types.TaskPayload) error { payloadData, err := payload.ToJSON() if err != nil { c.logger.Error("序列化任务载荷失败", zap.Error(err)) return err } task := asynq.NewTask(string(taskType), payloadData) _, err = c.client.EnqueueContext(ctx, task) if err != nil { c.logger.Error("入队任务失败", zap.String("task_type", string(taskType)), zap.Error(err)) return err } c.logger.Info("任务入队成功", zap.String("task_type", string(taskType))) return nil } // EnqueueDelayed 延时入队任务 func (c *AsynqClient) EnqueueDelayed(ctx context.Context, taskType types.TaskType, payload types.TaskPayload, delay time.Duration) error { payloadData, err := payload.ToJSON() if err != nil { c.logger.Error("序列化任务载荷失败", zap.Error(err)) return err } task := asynq.NewTask(string(taskType), payloadData) _, err = c.client.EnqueueContext(ctx, task, asynq.ProcessIn(delay)) if err != nil { c.logger.Error("延时入队任务失败", zap.String("task_type", string(taskType)), zap.Error(err)) return err } c.logger.Info("延时任务入队成功", zap.String("task_type", string(taskType)), zap.Duration("delay", delay)) return nil } // EnqueueAt 指定时间入队任务 func (c *AsynqClient) EnqueueAt(ctx context.Context, taskType types.TaskType, payload types.TaskPayload, scheduledAt time.Time) error { payloadData, err := payload.ToJSON() if err != nil { c.logger.Error("序列化任务载荷失败", zap.Error(err)) return err } task := asynq.NewTask(string(taskType), payloadData) _, err = c.client.EnqueueContext(ctx, task, asynq.ProcessAt(scheduledAt)) if err != nil { c.logger.Error("定时入队任务失败", zap.String("task_type", string(taskType)), zap.Error(err)) return err } c.logger.Info("定时任务入队成功", zap.String("task_type", string(taskType)), zap.Time("scheduled_at", scheduledAt)) return nil } // Close 关闭客户端 func (c *AsynqClient) Close() error { return c.client.Close() }