scheduler.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package task_pg
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. "github.com/hibiken/asynq"
  7. "go.uber.org/zap"
  8. )
  9. type SchedulerManager struct {
  10. utc *asynq.Scheduler // UTC时间
  11. zh *asynq.Scheduler // 中国时间(上海)
  12. sg *asynq.Scheduler // 新加坡时间
  13. la *asynq.Scheduler // 洛杉矶时间
  14. ny *asynq.Scheduler // 纽约时间
  15. }
  16. var once sync.Once
  17. var schedulerManager SchedulerManager
  18. func NewSchedulerManager(redisOpt asynq.RedisClientOpt) *SchedulerManager {
  19. once.Do(func() {
  20. zh_loc, err := time.LoadLocation("Asia/Shanghai")
  21. if err != nil {
  22. zap.L().Error("Load timezone Asia/Shanghai failed.", zap.String("err", err.Error()))
  23. }
  24. sg_loc, err := time.LoadLocation("Asia/Singapore")
  25. if err != nil {
  26. zap.L().Error("Load timezone Asia/Singapore failed.", zap.String("err", err.Error()))
  27. }
  28. la_loc, err := time.LoadLocation("America/Los_Angeles")
  29. if err != nil {
  30. zap.L().Error("Load timezone America/Los_Angeles failed.", zap.String("err", err.Error()))
  31. }
  32. ny_loc, err := time.LoadLocation("America/New_York")
  33. if err != nil {
  34. zap.L().Error("Load timezone America/New_York failed.", zap.String("err", err.Error()))
  35. }
  36. schedulerManager = SchedulerManager{
  37. utc: asynq.NewScheduler(redisOpt, &asynq.SchedulerOpts{Location: time.UTC}),
  38. zh: asynq.NewScheduler(redisOpt, &asynq.SchedulerOpts{Location: zh_loc}),
  39. sg: asynq.NewScheduler(redisOpt, &asynq.SchedulerOpts{Location: sg_loc}),
  40. la: asynq.NewScheduler(redisOpt, &asynq.SchedulerOpts{Location: la_loc}),
  41. ny: asynq.NewScheduler(redisOpt, &asynq.SchedulerOpts{Location: ny_loc}),
  42. }
  43. schedulerManager.utc.Start()
  44. schedulerManager.zh.Start()
  45. schedulerManager.sg.Start()
  46. schedulerManager.la.Start()
  47. schedulerManager.ny.Start()
  48. })
  49. return &schedulerManager
  50. }
  51. // 注册UTC Scheduler
  52. func (sm *SchedulerManager) RegisterUtcScheduler(name string, cronspec string, task *asynq.Task, opts ...asynq.Option) error {
  53. if sm.utc == nil {
  54. return fmt.Errorf("RegisterUtcScheduler failed, SchedulerManager utc not initialized.(%s)", name)
  55. }
  56. entryID, err := sm.utc.Register(cronspec, task, opts...)
  57. if err != nil {
  58. zap.L().Error("UTC Scheduler register failed.", zap.String("err", err.Error()), zap.String("name", name))
  59. return err
  60. }
  61. zap.L().Info("UTC Scheduler register successful.", zap.String("name", name), zap.String("entryID", entryID))
  62. return nil
  63. }
  64. // 注册ZH(China) Scheduler
  65. func (sm *SchedulerManager) RegisterZhScheduler(name string, cronspec string, task *asynq.Task, opts ...asynq.Option) error {
  66. if sm.zh == nil {
  67. return fmt.Errorf("RegisterUtcScheduler failed, SchedulerManager zh not initialized.")
  68. }
  69. entryID, err := sm.zh.Register(cronspec, task, opts...)
  70. if err != nil {
  71. zap.L().Error("ZH Scheduler register failed.", zap.String("err", err.Error()), zap.String("name", name))
  72. return err
  73. }
  74. zap.L().Info("ZH Scheduler register successful.", zap.String("name", name), zap.String("entryID", entryID))
  75. return nil
  76. }
  77. // 注册SG(Singapore) Scheduler
  78. func (sm *SchedulerManager) RegisterSgScheduler(name string, cronspec string, task *asynq.Task, opts ...asynq.Option) error {
  79. if sm.sg == nil {
  80. return fmt.Errorf("RegisterUtcScheduler failed, SchedulerManager sg not initialized.")
  81. }
  82. entryID, err := sm.sg.Register(cronspec, task, opts...)
  83. if err != nil {
  84. zap.L().Error("SG Scheduler register failed.", zap.String("err", err.Error()), zap.String("name", name))
  85. return err
  86. }
  87. zap.L().Info("SG Scheduler register successful.", zap.String("name", name), zap.String("entryID", entryID))
  88. return nil
  89. }
  90. // 注册LA(US/Los Angeles) Scheduler
  91. func (sm *SchedulerManager) RegisterLaScheduler(name string, cronspec string, task *asynq.Task, opts ...asynq.Option) error {
  92. if sm.la == nil {
  93. return fmt.Errorf("RegisterUtcScheduler failed, SchedulerManager la not initialized.")
  94. }
  95. entryID, err := sm.la.Register(cronspec, task, opts...)
  96. if err != nil {
  97. zap.L().Error("LA Scheduler register failed.", zap.String("err", err.Error()), zap.String("name", name))
  98. return err
  99. }
  100. zap.L().Info("LA Scheduler register successful.", zap.String("name", name), zap.String("entryID", entryID))
  101. return nil
  102. }
  103. // 注册NY(US/New York) Scheduler
  104. func (sm *SchedulerManager) RegisterNyScheduler(name string, cronspec string, task *asynq.Task, opts ...asynq.Option) error {
  105. if sm.ny == nil {
  106. return fmt.Errorf("RegisterUtcScheduler failed, SchedulerManager ny not initialized.")
  107. }
  108. entryID, err := sm.ny.Register(cronspec, task, opts...)
  109. if err != nil {
  110. zap.L().Error("NY Scheduler register failed.", zap.String("err", err.Error()), zap.String("name", name))
  111. return err
  112. }
  113. zap.L().Info("NY Scheduler register successful.", zap.String("name", name), zap.String("entryID", entryID))
  114. return nil
  115. }