88 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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()
 | |
| } |