new
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user