package action import ( "joybuywork/internal/app" "joybuywork/internal/consts/ckey" "joybuywork/internal/repository/dao" "joybuywork/internal/repository/model" "joybuywork/internal/service/crons/action/containers" "joybuywork/internal/service/queue/producer" "joybuywork/internal/service/queue/types" "joybuywork/internal/utils" "joybuywork/internal/utils/logic" "joybuywork/proto/go_proto/workerr" "sync" "time" "github.com/panjf2000/ants/v2" ) type Notify struct { Action } func (s *Notify) Desc() string { return "重新回调" } func (s *Notify) OnceKey() *OnceKey { return &OnceKey{ exp: 2 * time.Minute, key: ckey.CronNotifyReward(), release: true, } } func (s *Notify) Exec() (err error) { m := dao.FissionNotifyTask ntfM := dao.FissionNotify //找到需要重新回调的任务 list, err := m.WithContext(s.ctx).Where(m.DoTime.Lte(time.Now().Add(-time.Hour).Unix())).Find() if err != nil { return } if len(list) == 0 { return } //任务对应的回调数据 var ntfIds []int64 for _, v := range list { ntfIds = append(ntfIds, v.NotifyID) } var idsGroup = utils.Groups[int64](ntfIds, 200) gop, _ := ants.NewPool(10) defer gop.Release() wg := sync.WaitGroup{} for _, ids := range idsGroup { wg.Add(1) _ = gop.Submit(func() { defer wg.Done() ntfL, _ := ntfM.WithContext(s.ctx).Where(ntfM.ID.In(ids...)).Find() var ntfMap = make(map[int64]*model.FissionNotify) for _, v := range ntfL { ntfMap[v.ID] = v } for _, v := range list { producer.RewardPushPub(s.ctx, 1, types.DelayCommonRewardPush{TaskId: v.ID}) } }) } wg.Wait() return } type PushNotify struct { Action } func (s *PushNotify) Desc() string { return "推送提醒回调" } func (s *PushNotify) OnceKey() *OnceKey { return &OnceKey{ exp: 2 * time.Minute, key: ckey.CronPushNotify(), release: true, } } func (s *PushNotify) Exec() (err error) { container := new(containers.PushNotify) { container.Init(s.ctx, logic.WithErrNotifyNeqCode(workerr.MysqlErrorCode, workerr.CacheErrorCode, workerr.RedisErrorCode)) } return container.Run() } type PProfCollector struct { Action } func (s *PProfCollector) Desc() string { return "pprof采集" } func (s *PProfCollector) OnceKey() *OnceKey { return nil } func (s *PProfCollector) Exec() (err error) { // 创建采集器(每 5 分钟采集一次,禁用 CPU Profiling) collector := app.NewPProfCollector() // 启动采集任务 collector.Start() return } type HeartBeatCollector struct { Action } func (s *HeartBeatCollector) Desc() string { return "pprof采集" } func (s *HeartBeatCollector) OnceKey() *OnceKey { return nil } func (s *HeartBeatCollector) Exec() (err error) { app.HeartBeat() return } type GlobalRewardPushNotify struct { Action } func (s *GlobalRewardPushNotify) Desc() string { return "全局奖品重新回调" } func (s *GlobalRewardPushNotify) OnceKey() *OnceKey { return &OnceKey{ exp: 2 * time.Minute, key: ckey.CronGlobalRewardPushNotify(), release: true, } } func (s *GlobalRewardPushNotify) Exec() (err error) { m := dao.RewardPushTask //找到需要重新回调的任务 list, err := m.WithContext(s.ctx).Where(m.DoTime.Lte(time.Now().Add(-time.Hour).Unix())).Find() if err != nil { return } if len(list) == 0 { return } for _, v := range list { producer.GlobalRewardPushPub(s.ctx, 1, types.DelayCommonGlobalRewardPush{TaskId: v.ID}) } return }