You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cronlogic.go 1.8 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package logic
  2. import (
  3. "github.com/zeromicro/go-zero/core/logx"
  4. "gitlink.org.cn/jcce-pcm/pcm-coordinator/model"
  5. "gitlink.org.cn/jcce-pcm/pcm-coordinator/rpc/internal/svc"
  6. "gorm.io/gorm"
  7. "strings"
  8. )
  9. func InitCron(svc *svc.ServiceContext) {
  10. svc.Cron.Start()
  11. svc.Cron.AddFunc("*/5 * * * * ?", func() {
  12. var tasks []model.Task
  13. svc.DbEngin.Not("status = ?", "Completed").Find(&tasks)
  14. for _, task := range tasks {
  15. var allStatus string
  16. tx := svc.DbEngin.Raw("SELECT CONCAT_WS(',',GROUP_CONCAT(DISTINCT h.status) ,GROUP_CONCAT(DISTINCT a.status) ,GROUP_CONCAT(DISTINCT c.status))as status from task t left join hpc h on t.id = h.task_id left join cloud c on t.id = c.task_id left join ai a on t.id = a.task_id where t.id = ?", task.Id).Scan(&allStatus)
  17. if tx.Error != nil {
  18. logx.Error(tx.Error)
  19. }
  20. // 子状态统一则修改主任务状态
  21. statusArray := strings.Split(allStatus, ",")
  22. if len(RemoveRepeatedElement(statusArray)) == 1 {
  23. updateTask(svc.DbEngin, &task, statusArray[0])
  24. continue
  25. }
  26. // 子任务包含失败状态 主任务则失败
  27. if strings.Contains(allStatus, "Failed") {
  28. updateTask(svc.DbEngin, &task, "Failed")
  29. continue
  30. }
  31. if strings.Contains(allStatus, "Running") {
  32. updateTask(svc.DbEngin, &task, "Running")
  33. }
  34. }
  35. })
  36. }
  37. func updateTask(dbEngin *gorm.DB, task *model.Task, status string) {
  38. if task.Status != status {
  39. task.Status = status
  40. dbEngin.Updates(&task)
  41. }
  42. }
  43. func RemoveRepeatedElement(arr []string) (newArr []string) {
  44. newArr = make([]string, 0)
  45. for i := 0; i < len(arr); i++ {
  46. repeat := false
  47. for j := i + 1; j < len(arr); j++ {
  48. if arr[i] == arr[j] {
  49. repeat = true
  50. break
  51. }
  52. }
  53. if !repeat {
  54. newArr = append(newArr, arr[i])
  55. }
  56. }
  57. return
  58. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.