package queue import ( "bdrp-server/app/main/api/internal/svc" "bdrp-server/app/main/api/internal/types" "context" "fmt" "time" "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" ) type CronJob struct { ctx context.Context svcCtx *svc.ServiceContext } const AgentMembershipExpireScanTaskTime = "5 0 * * *" func NewCronJob(ctx context.Context, svcCtx *svc.ServiceContext) *CronJob { return &CronJob{ ctx: ctx, svcCtx: svcCtx, } } func (l *CronJob) Register() *asynq.ServeMux { redisClientOpt := asynq.RedisClientOpt{Addr: l.svcCtx.Config.CacheRedis[0].Host, Password: l.svcCtx.Config.CacheRedis[0].Pass} scheduler := asynq.NewScheduler(redisClientOpt, nil) // 注册清理查询数据任务 task := asynq.NewTask(types.MsgCleanQueryData, nil, nil) _, err := scheduler.Register(TASKTIME, task) if err != nil { panic(fmt.Sprintf("定时任务注册失败:%v", err)) } // 注册会员到期扫描任务(每天凌晨执行) expireScanTask := asynq.NewTask(types.MsgAgentMembershipExpireScan, nil, nil) _, err = scheduler.Register(AgentMembershipExpireScanTaskTime, expireScanTask) if err != nil { panic(fmt.Sprintf("会员到期扫描任务注册失败:%v", err)) } // 启动补偿:服务启动后立即触发一次扫描任务(按日期去重) client := asynq.NewClient(redisClientOpt) startupTaskID := fmt.Sprintf("agent_membership_expire_scan_startup_%s", time.Now().Format("20060102")) _, enqueueErr := client.Enqueue( asynq.NewTask(types.MsgAgentMembershipExpireScan, nil), asynq.MaxRetry(1), asynq.TaskID(startupTaskID), ) if enqueueErr != nil { logx.Errorf("启动补偿扫描任务入队失败: %v", enqueueErr) } if closeErr := client.Close(); closeErr != nil { logx.Errorf("关闭启动补偿任务客户端失败: %v", closeErr) } scheduler.Start() fmt.Println("定时任务启动!!!") mux := asynq.NewServeMux() mux.Handle(types.MsgPaySuccessQuery, NewPaySuccessNotifyUserHandler(l.svcCtx)) mux.Handle(types.MsgCleanQueryData, NewCleanQueryDataHandler(l.svcCtx)) mux.Handle(types.MsgUnfreezeCommission, NewUnfreezeCommissionHandler(l.svcCtx)) mux.Handle(types.MsgAgentMembershipExpireScan, NewAgentMembershipExpireScanHandler(l.svcCtx)) mux.Handle(types.MsgAgentMembershipExpireHandle, NewAgentMembershipExpireHandleHandler(l.svcCtx)) return mux }