taskCore.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package task_core
  2. import (
  3. task_pg "fwh-toolbox-server/task/plugin"
  4. "github.com/hibiken/asynq"
  5. "go.uber.org/zap"
  6. )
  7. // RedisDB 任务队列使用的 Redis 库号。主服务(worker)与只入队的独立进程(fwh-agent-mcp)必须一致
  8. const RedisDB = 12
  9. // type TaskCore interface {
  10. // CreateTask() *asynq.Client
  11. // }
  12. type TaskCore struct {
  13. redisOpt asynq.RedisClientOpt
  14. client *asynq.Client
  15. Scheduler *task_pg.SchedulerManager
  16. Inspector *task_pg.InspectorManager
  17. }
  18. type TaskConfig struct {
  19. Name string // 任务名
  20. SvrCfg asynq.Config
  21. Mux *asynq.ServeMux
  22. Agg *task_pg.AggregatorManager // 可选
  23. }
  24. // 创建TaskCore
  25. func NewTaskCore(redisOpt asynq.RedisClientOpt) *TaskCore {
  26. return &TaskCore{
  27. redisOpt: redisOpt,
  28. client: asynq.NewClient(redisOpt),
  29. Scheduler: task_pg.NewSchedulerManager(redisOpt),
  30. Inspector: task_pg.NewInspectorManager(redisOpt),
  31. }
  32. }
  33. // 创建任务
  34. func (tc *TaskCore) CreateTask(config TaskConfig) *asynq.Client {
  35. if config.Mux != nil {
  36. svr := asynq.NewServer(tc.redisOpt, config.SvrCfg)
  37. go func() {
  38. err := svr.Run(config.Mux)
  39. if err != nil {
  40. zap.L().Error("could not run server", zap.String("err", err.Error()), zap.String("taskName", config.Name))
  41. return
  42. }
  43. zap.L().Warn("asynq server shutdown", zap.String("taskName", config.Name))
  44. }()
  45. } else {
  46. zap.L().Warn("asynq not server", zap.String("taskName", config.Name))
  47. }
  48. if tc.client == nil {
  49. tc.client = asynq.NewClient(tc.redisOpt)
  50. }
  51. return tc.client
  52. }