diff --git a/dao/cid.go b/dao/cid.go index 6233dc6..4425e07 100644 --- a/dao/cid.go +++ b/dao/cid.go @@ -93,12 +93,12 @@ func FindRunLogByAuthID(auth_id int) []CIDRunLog { func FindRunLogByID(auth_id, cid_id int) []CIDRunLog { var cidRunLog []CIDRunLog - DB.Debug().Where("cid_id = ? and auth_id = ?", cid_id, auth_id).Order("created_at desc").Find(&cidRunLog) + DB.Debug().Where("cid_id = ? and auth_id = ?", cid_id, auth_id).Order("created_at desc").Find(&cidRunLog).Limit(30) return cidRunLog } func FindRunLogByCIDLogID(id, auth_id int) []CIDRunLog { var cidRunLogs []CIDRunLog - DB.Debug().Where("id = ? and auth_id = ?", id, auth_id).Order("created_at desc").Find(&cidRunLogs) + DB.Debug().Where("id = ? and auth_id = ?", id, auth_id).Order("created_at desc").Find(&cidRunLogs).Limit(30) return cidRunLogs } diff --git a/handler/cid.go b/handler/cid.go index d052b7f..ed5469f 100644 --- a/handler/cid.go +++ b/handler/cid.go @@ -41,6 +41,9 @@ type CIDUpdateReq struct { Token string `json:"cidtoken" form:"cidtoken"` } +// 全局变量,记录是否进行cron定时任务的刷新 +var cron_count int + func SetUpCIDGroup(router *gin.Engine) { cidGroup := router.Group("/cid") //持续集成、部署 cidGroup.POST("/create", CreateCID) @@ -88,6 +91,9 @@ func CreateCID(c *gin.Context) { token, _ := generateRandomHexString(32) res := dao.CreateCID(req.Name, req.Url, req.Script, token, req.Time, authID) if res != 0 { + if req.Time > 0 { + updateCronRedisTime(int(res), req.Time) + } c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": res}) } else { c.JSON(200, gin.H{"error": "CreateCID failed", "code": proto.OperationFailed, "message": "failed"}) @@ -126,6 +132,9 @@ func UpdateCID(c *gin.Context) { c.JSON(200, gin.H{"error": "CID not found", "code": proto.OperationFailed, "message": "failed"}) return } else { + if req.Time > 0 { + updateCronRedisTime(req.ID, req.Time) + } c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"}) } } else { @@ -228,6 +237,11 @@ echo "end"` // 定时任务处理逻辑 func RunCron() { + cron_count++ + if cron_count > 6 { + updateCronFromDBToRedis() + cron_count = 0 + } //从redis查看是否有定时任务 //如果有定时任务,执行定时任务 //如果没有定时任务,查找数据库是否有定时任务,如果有,则加入redis,如果没有,则不做任何操作 @@ -235,20 +249,7 @@ func RunCron() { res := worker.GetRedis(key) //fmt.Println("cid run cron res:", res) if res == "" { - cids := dao.FindCIDByTime() - cid_workers := make([]proto.CIDRUN, 0) - for _, v := range cids { - cid_worker := proto.CIDRUN{CID: v.ID, Curr: v.Time, Every: v.Time} - cid_workers = append(cid_workers, cid_worker) - } - if len(cid_workers) > 0 { - //将定时任务加入redis - json_data, err := json.Marshal(cid_workers) - if err != nil { - fmt.Println("json marshal failed") - } - worker.SetRedis(key, string(json_data)) - } + readCronFromDBToRedis(key) } else { var cid_workers []proto.CIDRUN err := json.Unmarshal([]byte(res), &cid_workers) @@ -277,3 +278,94 @@ func RunCron() { } } + +// 将数据库中的定时任务加入redis +func readCronFromDBToRedis(key string) { + cids := dao.FindCIDByTime() + cid_workers := make([]proto.CIDRUN, 0) + for _, v := range cids { + cid_worker := proto.CIDRUN{CID: v.ID, Curr: v.Time, Every: v.Time} + cid_workers = append(cid_workers, cid_worker) + } + if len(cid_workers) > 0 { + //将定时任务加入redis + json_data, err := json.Marshal(cid_workers) + if err != nil { + fmt.Println("json marshal failed") + } + worker.SetRedis(key, string(json_data)) + } +} + +// 从数据库更新定时任务到redis +func updateCronFromDBToRedis() { + key := "cron_cid_runs" + cids := dao.FindCIDByTime() + cid_maps := make(map[uint]int) + + //将数据库中的定时任务加入map,key为cid,value为时间,便于后续查找 + for _, v := range cids { + cid_maps[v.ID] = v.Time + } + res := worker.GetRedis(key) + if res == "" { + readCronFromDBToRedis(key) + return + } + var cid_workers_redis []proto.CIDRUN + err := json.Unmarshal([]byte(res), &cid_workers_redis) + if err != nil { + fmt.Println("json unmarshal failed") + return + } + for i, v := range cid_workers_redis { + if time, ok := cid_maps[v.CID]; ok { + if v.Every != time { + cid_workers_redis[i].Every = time + cid_workers_redis[i].Curr = time + } + } + } + //将定时任务加入redis + json_data, err := json.Marshal(cid_workers_redis) + if err != nil { + fmt.Println("json marshal failed") + return + } + worker.SetRedis(key, string(json_data)) +} + +// 查看指定定时任务是否存在,如果存在则更新时间,如果不存在则加入 +func updateCronRedisTime(id int, time int) { + key := "cron_cid_runs" + res := worker.GetRedis(key) + if res == "" { + readCronFromDBToRedis(key) + return + } else { + var cid_workers []proto.CIDRUN + err := json.Unmarshal([]byte(res), &cid_workers) + if err != nil { + fmt.Println("json unmarshal failed") + } + isContain := false + for i, v := range cid_workers { + if v.CID == uint(id) { + //更新时间,不会继续原来的时间 + cid_workers[i].Curr = time + cid_workers[i].Every = time + isContain = true + } + } + if isContain == false { + cid_worker := proto.CIDRUN{CID: uint(id), Curr: time, Every: time} + cid_workers = append(cid_workers, cid_worker) + } + //将定时任务加入redis + json_data, err := json.Marshal(cid_workers) + if err != nil { + fmt.Println("json marshal failed") + } + worker.SetRedis(key, string(json_data)) + } +}