fwhEnqueue.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package fwhQueue
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "fwh-toolbox-server/domain"
  6. "time"
  7. "github.com/hibiken/asynq"
  8. "go.uber.org/zap"
  9. )
  10. // ==================== 对外暴露的入队函数 ====================
  11. // EnqueueBatchDownloadTask 入队批量数据下载任务
  12. func EnqueueBatchDownloadTask(payload domain.TaskBatchDownload) error {
  13. data, err := json.Marshal(payload)
  14. if err != nil {
  15. return fmt.Errorf("marshal BatchDownload payload: %w", err)
  16. }
  17. taskId := newTaskID(TaskTypeBatchDownload, payload.Id.Hex())
  18. task := asynq.NewTask(TaskTypeBatchDownload, data,
  19. asynq.MaxRetry(0), // 主任务不重试(内部自行管理状态)
  20. asynq.Timeout(120*time.Minute), // 2 小时超时
  21. asynq.Queue(QueueMain), // 主队列
  22. asynq.TaskID(taskId), // 固定 ID 防止重复提交
  23. asynq.Retention(7*24*time.Hour), // 完成后保留 7 天
  24. )
  25. info, err := TaskClient.Enqueue(task)
  26. if err != nil {
  27. zap.L().Error("[Enqueue] BatchDownload 入队失败",
  28. zap.String("id", payload.Id.Hex()),
  29. zap.String("err", err.Error()),
  30. )
  31. return err
  32. }
  33. zap.L().Info("[Enqueue] BatchDownload 入队成功",
  34. zap.String("id", payload.Id.Hex()),
  35. zap.String("taskId", info.ID),
  36. zap.String("queue", info.Queue),
  37. )
  38. return nil
  39. }
  40. // EnqueueSiteAnalysisTask 入队站点分析任务
  41. func EnqueueSiteAnalysisTask(payload domain.TaskSiteAnalysis) error {
  42. data, err := json.Marshal(payload)
  43. if err != nil {
  44. return fmt.Errorf("marshal SiteAnalysis payload: %w", err)
  45. }
  46. taskId := newTaskID(TaskTypeSiteAnalysis, payload.Id.Hex())
  47. task := asynq.NewTask(TaskTypeSiteAnalysis, data,
  48. asynq.MaxRetry(0), // 不重试
  49. asynq.Timeout(60*time.Minute), // 1 小时超时
  50. asynq.Queue(QueueMain),
  51. asynq.TaskID(taskId),
  52. asynq.Retention(7*24*time.Hour),
  53. )
  54. info, err := TaskClient.Enqueue(task)
  55. if err != nil {
  56. zap.L().Error("[Enqueue] SiteAnalysis 入队失败",
  57. zap.String("id", payload.Id.Hex()),
  58. zap.String("err", err.Error()),
  59. )
  60. return err
  61. }
  62. zap.L().Info("[Enqueue] SiteAnalysis 入队成功",
  63. zap.String("id", payload.Id.Hex()),
  64. zap.String("taskId", info.ID),
  65. )
  66. return nil
  67. }
  68. // EnqueueShutdownStatisticsTask 入队 Shutdown 统计任务
  69. func EnqueueShutdownStatisticsTask(payload domain.TaskShutdownStatistics) error {
  70. data, err := json.Marshal(payload)
  71. if err != nil {
  72. return fmt.Errorf("marshal ShutdownStatistics payload: %w", err)
  73. }
  74. taskId := newTaskID(TaskTypeShutdownStats, payload.Date)
  75. task := asynq.NewTask(TaskTypeShutdownStats, data,
  76. asynq.MaxRetry(0),
  77. asynq.Timeout(30*time.Minute),
  78. asynq.Queue(QueueMain),
  79. asynq.TaskID(taskId),
  80. asynq.Unique(10*time.Minute), // 10 分钟内去重
  81. asynq.Retention(7*24*time.Hour),
  82. )
  83. info, err := TaskClient.Enqueue(task)
  84. if err != nil {
  85. zap.L().Error("[Enqueue] ShutdownStatistics 入队失败",
  86. zap.String("date", payload.Date),
  87. zap.String("err", err.Error()),
  88. )
  89. return err
  90. }
  91. zap.L().Info("[Enqueue] ShutdownStatistics 入队成功",
  92. zap.String("date", payload.Date),
  93. zap.String("taskId", info.ID),
  94. )
  95. return nil
  96. }
  97. // EnqueueSiteInfoUpdateTask 入队站点信息更新任务(唯一任务)
  98. func EnqueueSiteInfoUpdateTask(payload domain.TaskSiteInfoUpdate) error {
  99. data, err := json.Marshal(payload)
  100. if err != nil {
  101. return fmt.Errorf("marshal SiteInfoUpdate payload: %w", err)
  102. }
  103. taskId := newTaskID(TaskTypeSiteInfoUpdate, payload.Id.Hex())
  104. task := asynq.NewTask(TaskTypeSiteInfoUpdate, data,
  105. asynq.MaxRetry(0),
  106. asynq.Timeout(60*time.Minute),
  107. asynq.Queue(QueueMain),
  108. asynq.TaskID(taskId),
  109. asynq.Unique(30*time.Minute), // 30 分钟内去重(保证唯一性)
  110. asynq.Retention(7*24*time.Hour),
  111. )
  112. info, err := TaskClient.Enqueue(task)
  113. if err != nil {
  114. zap.L().Error("[Enqueue] SiteInfoUpdate 入队失败",
  115. zap.String("id", payload.Id.Hex()),
  116. zap.String("err", err.Error()),
  117. )
  118. return err
  119. }
  120. zap.L().Info("[Enqueue] SiteInfoUpdate 入队成功",
  121. zap.String("id", payload.Id.Hex()),
  122. zap.String("taskId", info.ID),
  123. )
  124. return nil
  125. }