Merge branch 'refs/heads/feat-cid'

This commit is contained in:
junleea 2024-11-23 17:46:49 +08:00
commit cf7d5d7992
2 changed files with 108 additions and 16 deletions

View File

@ -93,12 +93,12 @@ func FindRunLogByAuthID(auth_id int) []CIDRunLog {
func FindRunLogByID(auth_id, cid_id int) []CIDRunLog { func FindRunLogByID(auth_id, cid_id int) []CIDRunLog {
var cidRunLog []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 return cidRunLog
} }
func FindRunLogByCIDLogID(id, auth_id int) []CIDRunLog { func FindRunLogByCIDLogID(id, auth_id int) []CIDRunLog {
var cidRunLogs []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 return cidRunLogs
} }

View File

@ -41,6 +41,9 @@ type CIDUpdateReq struct {
Token string `json:"cidtoken" form:"cidtoken"` Token string `json:"cidtoken" form:"cidtoken"`
} }
// 全局变量记录是否进行cron定时任务的刷新
var cron_count int
func SetUpCIDGroup(router *gin.Engine) { func SetUpCIDGroup(router *gin.Engine) {
cidGroup := router.Group("/cid") //持续集成、部署 cidGroup := router.Group("/cid") //持续集成、部署
cidGroup.POST("/create", CreateCID) cidGroup.POST("/create", CreateCID)
@ -88,6 +91,9 @@ func CreateCID(c *gin.Context) {
token, _ := generateRandomHexString(32) token, _ := generateRandomHexString(32)
res := dao.CreateCID(req.Name, req.Url, req.Script, token, req.Time, authID) res := dao.CreateCID(req.Name, req.Url, req.Script, token, req.Time, authID)
if res != 0 { if res != 0 {
if req.Time > 0 {
updateCronRedisTime(int(res), req.Time)
}
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": res}) c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": res})
} else { } else {
c.JSON(200, gin.H{"error": "CreateCID failed", "code": proto.OperationFailed, "message": "failed"}) 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"}) c.JSON(200, gin.H{"error": "CID not found", "code": proto.OperationFailed, "message": "failed"})
return return
} else { } else {
if req.Time > 0 {
updateCronRedisTime(req.ID, req.Time)
}
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"}) c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"})
} }
} else { } else {
@ -228,6 +237,11 @@ echo "end"`
// 定时任务处理逻辑 // 定时任务处理逻辑
func RunCron() { func RunCron() {
cron_count++
if cron_count > 6 {
updateCronFromDBToRedis()
cron_count = 0
}
//从redis查看是否有定时任务 //从redis查看是否有定时任务
//如果有定时任务,执行定时任务 //如果有定时任务,执行定时任务
//如果没有定时任务查找数据库是否有定时任务如果有则加入redis如果没有则不做任何操作 //如果没有定时任务查找数据库是否有定时任务如果有则加入redis如果没有则不做任何操作
@ -235,20 +249,7 @@ func RunCron() {
res := worker.GetRedis(key) res := worker.GetRedis(key)
//fmt.Println("cid run cron res:", res) //fmt.Println("cid run cron res:", res)
if res == "" { if res == "" {
cids := dao.FindCIDByTime() readCronFromDBToRedis(key)
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))
}
} else { } else {
var cid_workers []proto.CIDRUN var cid_workers []proto.CIDRUN
err := json.Unmarshal([]byte(res), &cid_workers) 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)
//将数据库中的定时任务加入mapkey为cidvalue为时间便于后续查找
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))
}
}