79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
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))
|
||
}
|