package tasks import ( "gitee.ltd/lxh/wechat-robot/internal/model" "github.com/go-co-op/gocron/v2" "github.com/google/uuid" "log" "sync" ) // 定时任务调度器 var scheduler gocron.Scheduler // 已启动定时任务的微信机器人 var enabledMap = sync.Map{} // Start // @description: 启动任务 func Start() { var err error scheduler, err = gocron.NewScheduler() if err != nil { log.Panicf("定时任务启动失败: %v", err) } // 预添加已经确定的任务 db := model.GetDB() // 查询数据库,获取在线的机器人 var robots []model.Robot if err = db.Where("status = 'online'").Find(&robots).Error; err != nil { log.Panicf("查询机器人失败: %v", err) } // 遍历机器人,添加任务 for _, robot := range robots { var job gocron.Job job, err = scheduler.NewJob( gocron.CronJob("*/5 * * * * *", true), // 五秒钟同步一次 gocron.NewTask(syncMessage, robot.ContainerHost, robot.WechatID, robot.ID), ) if err != nil { log.Panicf("添加定时任务失败: %v", err) } // 添加到已启动的任务列表 enabledMap.Store(robot.ID, job.ID()) } // 启动定时任务 scheduler.Start() log.Println("定时任务已启动") } // AddJob // @description: 添加任务 func AddJob(robot model.Robot) { job, err := scheduler.NewJob( gocron.CronJob("*/5 * * * * *", true), // 五秒钟同步一次 gocron.NewTask(syncMessage, robot.ContainerHost, robot.WechatID, robot.ID), ) if err != nil { log.Printf("添加定时任务失败: %v", err) return } // 添加到已启动的任务列表 enabledMap.Store(robot.ID, job.ID()) } // DeleteJob // @description: 删除定时任务 // @param robotId func DeleteJob(robotId uint) { // 先取出任务Id jobId, ok := enabledMap.Load(robotId) if !ok { log.Printf("定时任务不存在,robotId: %d", robotId) return } _ = scheduler.RemoveJob(jobId.(uuid.UUID)) }