package domain import ( "admin/apps/game/domain/entity" "admin/apps/game/domain/projects" "admin/apps/game/model" "admin/internal/consts" "admin/internal/event" "admin/internal/global" "admin/lib/dtimer" "admin/lib/xlog" "encoding/json" "fmt" "time" ) func (svc *CommonResourceService) startEventSubscriber() { event.GetMgrInstance().Subscribe("resource.create", event.EventTopic_DelayInvokeCreateHook, svc.handleResourceDelayInvokeCreateHook) } func (svc *CommonResourceService) handleResourceDelayInvokeCreateHook(msg *event.Msg) { payload := &event.EventPayload_DelayInvokeCreateHook{} err := json.Unmarshal(msg.Payload, payload) if err != nil { xlog.Warnf("unmarshal EventPayload_DelayInvokeCreateHook(%+v) error:%v", string(msg.Payload), err) return } if payload.Resource == consts.ResourcesName_MailGlobal { mailInfo := &model.GlobalMail{} err = json.Unmarshal(payload.Obj, mailInfo) if err != nil { xlog.Warnf("unmarshal mail(%+v) error:%v", string(payload.Obj), err) return } delayAt := payload.DelayAt if delayAt.After(time.Now()) { xlog.Infof("全服邮件[%+v]延迟到%v发送,添加到全局定时器。。。", mailInfo, delayAt.Format(time.DateTime)) global.GLOB_TIMER.Add(&dtimer.Timer{ Key: fmt.Sprintf("create.global.mail.%v", mailInfo.ID), Duration: delayAt.Sub(time.Now()), Callback: func() { _, projectEt, _, err := svc.projectRepo.GetById(payload.ProjectId) if err != nil { return } obj := new(entity.CommonResource).FromPo(mailInfo).ToCommonDto() hook, ok := projects.GetProjectResourceHook(projectEt, payload.Resource).(projects.IPostResourceOpCreateHook) if !ok { return } err = hook.Create(projectEt, payload.Resource, obj) if err != nil { xlog.Errorf("invoke hook create resource:%v obj:%+v error:%v", payload.Resource, obj) return } xlog.Infof("delay send global mail ok, mail info:%+v", mailInfo) // 更新数据库延迟时间为NULL resourceRepo := findCommResourceRepo(payload.Resource) err = resourceRepo.Repo.UpdateClearDelayInvokeCreateHookFieldN(mailInfo.ID) if err != nil { xlog.Errorf("UpdateClearDelayInvokeCreateHookFieldN id:%v error:%v", mailInfo.ID) } }, }) } } }