Files
ycc-proxy-server/app/main/api/internal/service/asynqService.go
2025-12-09 18:55:28 +08:00

124 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// asynq_service.go
package service
import (
"encoding/json"
"time"
"ycc-server/app/main/api/internal/config"
"ycc-server/app/main/api/internal/types"
"github.com/hibiken/asynq"
"github.com/zeromicro/go-zero/core/logx"
)
type AsynqService struct {
client *asynq.Client
config config.Config
}
// NewAsynqService 创建并初始化 Asynq 客户端
func NewAsynqService(c config.Config) *AsynqService {
client := asynq.NewClient(asynq.RedisClientOpt{
Addr: c.CacheRedis[0].Host,
Password: c.CacheRedis[0].Pass,
})
return &AsynqService{client: client, config: c}
}
// Close 关闭 Asynq 客户端
func (s *AsynqService) Close() error {
return s.client.Close()
}
func (s *AsynqService) SendQueryTask(orderID string) error {
// 准备任务的 payload
payload := types.MsgPaySuccessQueryPayload{
OrderID: orderID,
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
logx.Errorf("发送异步任务失败 (无法编码 payload): %v, 订单号: %s", err, orderID)
return err // 直接返回错误,避免继续执行
}
options := []asynq.Option{
asynq.MaxRetry(5), // 设置最大重试次数
}
// 创建任务
task := asynq.NewTask(types.MsgPaySuccessQuery, payloadBytes, options...)
// 将任务加入队列并获取任务信息
info, err := s.client.Enqueue(task)
if err != nil {
logx.Errorf("发送异步任务失败 (加入队列失败): %+v, 订单号: %s", err, orderID)
return err
}
// 记录成功日志,带上任务 ID 和队列信息
logx.Infof("发送异步任务成功任务ID: %s, 队列: %s, 订单号: %s", info.ID, info.Queue, orderID)
return nil
}
// SendAgentProcessTask 发送代理处理任务
func (s *AsynqService) SendAgentProcessTask(orderID string) error {
// 准备任务的 payload
payload := types.MsgAgentProcessPayload{
OrderID: orderID,
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
logx.Errorf("发送代理处理任务失败 (无法编码 payload): %v, 订单号: %s", err, orderID)
return err
}
options := []asynq.Option{
asynq.MaxRetry(5), // 设置最大重试次数
}
// 创建任务
task := asynq.NewTask(types.MsgAgentProcess, payloadBytes, options...)
// 将任务加入队列并获取任务信息
info, err := s.client.Enqueue(task)
if err != nil {
logx.Errorf("发送代理处理任务失败 (加入队列失败): %+v, 订单号: %s", err, orderID)
return err
}
// 记录成功日志,带上任务 ID 和队列信息
logx.Infof("发送代理处理任务成功任务ID: %s, 队列: %s, 订单号: %s", info.ID, info.Queue, orderID)
return nil
}
// SendUnfreezeTask 发送解冻任务(延迟执行)
func (s *AsynqService) SendUnfreezeTask(freezeTaskId string, processAt time.Time) error {
// 准备任务的 payload
payload := types.MsgUnfreezeCommissionPayload{
FreezeTaskId: freezeTaskId,
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
logx.Errorf("发送解冻任务失败 (无法编码 payload): %v, 冻结任务ID: %s", err, freezeTaskId)
return err
}
options := []asynq.Option{
asynq.MaxRetry(5), // 设置最大重试次数
asynq.ProcessAt(processAt), // 延迟到指定时间执行
asynq.Queue("critical"), // 使用关键队列
}
// 创建任务
task := asynq.NewTask(types.MsgUnfreezeCommission, payloadBytes, options...)
// 将任务加入队列并获取任务信息
info, err := s.client.Enqueue(task)
if err != nil {
logx.Errorf("发送解冻任务失败 (加入队列失败): %+v, 冻结任务ID: %s", err, freezeTaskId)
return err
}
// 记录成功日志,带上任务 ID 和队列信息
logx.Infof("发送解冻任务成功任务ID: %s, 队列: %s, 冻结任务ID: %s, 执行时间: %v", info.ID, info.Queue, freezeTaskId, processAt)
return nil
}