aggregator.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package task_pg
  2. import (
  3. "fmt"
  4. "sync"
  5. "github.com/hibiken/asynq"
  6. "go.uber.org/zap"
  7. )
  8. type AggregatorFunc func(tasks []*asynq.Task) *asynq.Task
  9. type AggregatorManager struct {
  10. mu sync.RWMutex
  11. aggregators map[string]AggregatorFunc // 聚合器映射表
  12. }
  13. func NewAggregatorManager() *AggregatorManager {
  14. return &AggregatorManager{
  15. aggregators: make(map[string]AggregatorFunc),
  16. }
  17. }
  18. func (manager *AggregatorManager) Aggregate(group string, tasks []*asynq.Task) *asynq.Task {
  19. manager.mu.RLock()
  20. fn, ok := manager.aggregators[group]
  21. manager.mu.RUnlock()
  22. if !ok {
  23. zap.L().Error("aggregator: group not found", zap.String("group", group))
  24. return nil // 或记录错误
  25. }
  26. return fn(tasks)
  27. }
  28. func (manager *AggregatorManager) Register(group string, fn AggregatorFunc) error {
  29. manager.mu.Lock()
  30. defer manager.mu.Unlock()
  31. if group == "" {
  32. return fmt.Errorf("AggregatorManager: group is empty")
  33. }
  34. if fn == nil {
  35. return fmt.Errorf("AggregatorManager: nil AggregatorFunc")
  36. }
  37. if _, ok := manager.aggregators[group]; ok {
  38. panic(fmt.Sprintf("aggregator: group [%s] already registered", group))
  39. }
  40. manager.aggregators[group] = fn
  41. return nil
  42. }
  43. func (manager *AggregatorManager) Unregister(group string) {
  44. manager.mu.Lock()
  45. defer manager.mu.Unlock()
  46. delete(manager.aggregators, group)
  47. }