支持多台服务器同时执行任务+优化页面

一个定时任务可以允许多台服务器同时执行任务,优化页面关闭并刷新列表页
This commit is contained in:
georgehao
2019-04-16 23:40:07 +08:00
parent 07aff7ee72
commit 830d49ee1c
24 changed files with 391 additions and 137 deletions

View File

@@ -9,11 +9,11 @@ package controllers
import (
"github.com/astaxie/beego"
"github.com/axgle/mahonia"
"github.com/george518/PPGo_Job/libs"
"github.com/george518/PPGo_Job/models"
"strconv"
"strings"
"github.com/axgle/mahonia"
)
const (
@@ -361,4 +361,9 @@ func gbkAsUtf8(str string) string {
resStr := srcDecoder.ConvertString(str)
_, resBytes, _ := desDecoder.Translate([]byte(resStr), true)
return string(resBytes)
}
}
//任务识别码
func jobKey(taskId, serverId int) int {
return taskId*10000 + serverId
}

View File

@@ -8,6 +8,7 @@
package controllers
import (
"fmt"
"strconv"
"strings"
"time"
@@ -78,6 +79,15 @@ func (self *TaskController) Edit() {
self.Data["notify_user_ids"] = notifyUserIds
server_ids := strings.Split(task.ServerIds, ",")
var server_ids_arr []int
for _, sv := range server_ids {
i, _ := strconv.Atoi(sv)
server_ids_arr = append(server_ids_arr, i)
}
self.Data["service_ids"] = server_ids_arr
notifyTplList, _, err := models.NotifyTplGetByTplTypeList(task.NotifyType)
tplList := make([]map[string]interface{}, len(notifyTplList))
@@ -145,13 +155,28 @@ func (self *TaskController) Detail() {
// 分组列表
self.Data["taskGroup"] = taskGroupLists(self.taskGroups, self.userId)
serverName := "本地服务器"
if task.ServerId == 0 {
serverName := ""
if task.ServerIds == "0" {
serverName = "本地服务器"
} else {
server, err := models.TaskServerGetById(task.ServerId)
if err == nil {
serverName = server.ServerName
serverIdSli := strings.Split(task.ServerIds, ",")
for _, v := range serverIdSli {
if v == "0" {
serverName = "本地服务器 "
}
}
servers, n := models.TaskServerGetByIds(task.ServerIds)
if n > 0 {
for _, server := range servers {
fmt.Println(server.Status)
if server.Status != 0 {
serverName += server.ServerName + "【无效】 "
} else {
serverName += server.ServerName + " "
}
}
} else {
serverName += "服务器异常!!"
}
}
@@ -212,7 +237,7 @@ func (self *TaskController) AjaxSave() {
task.TaskName = strings.TrimSpace(self.GetString("task_name"))
task.Description = strings.TrimSpace(self.GetString("description"))
task.Concurrent, _ = self.GetInt("concurrent")
task.ServerId, _ = self.GetInt("server_id")
task.ServerIds = strings.TrimSpace(self.GetString("server_ids"))
task.CronSpec = strings.TrimSpace(self.GetString("cron_spec"))
task.Command = strings.TrimSpace(self.GetString("command"))
task.Timeout, _ = self.GetInt("timeout")
@@ -258,7 +283,7 @@ func (self *TaskController) AjaxSave() {
task.Description = strings.TrimSpace(self.GetString("description"))
task.GroupId, _ = self.GetInt("group_id")
task.Concurrent, _ = self.GetInt("concurrent")
task.ServerId, _ = self.GetInt("server_id")
task.ServerIds = strings.TrimSpace(self.GetString("server_ids"))
task.CronSpec = strings.TrimSpace(self.GetString("cron_spec"))
task.Command = strings.TrimSpace(self.GetString("command"))
task.Timeout, _ = self.GetInt("timeout")
@@ -291,8 +316,6 @@ func (self *TaskController) AjaxSave() {
self.ajaxMsg("", MSG_OK)
}
//检查是否含有禁用命令
func checkCommand(command string) (string, bool) {
@@ -332,8 +355,6 @@ func (self *TaskController) AjaxNopass() {
self.ajaxMsg("", MSG_OK)
}
func (self *TaskController) AjaxStart() {
taskId, _ := self.GetInt("id")
if taskId == 0 {
@@ -349,15 +370,19 @@ func (self *TaskController) AjaxStart() {
self.ajaxMsg("任务状态有误", MSG_ERR)
}
job, err := jobs.NewJobFromTask(task)
jobArr, err := jobs.NewJobFromTask(task)
if err != nil {
self.ajaxMsg("创建任务失败", MSG_ERR)
}
if jobs.AddJob(task.CronSpec, job) {
task.Status = 1
task.Update()
for _, job := range jobArr {
if jobs.AddJob(task.CronSpec, job) {
task.Status = 1
task.Update()
}
}
self.ajaxMsg("", MSG_OK)
}
@@ -372,9 +397,18 @@ func (self *TaskController) AjaxPause() {
self.ajaxMsg("查不到该任务", MSG_ERR)
}
jobs.RemoveJob(taskId)
//移出任务
TaskServerIdsArr := strings.Split(task.ServerIds, ",")
for _, server_id := range TaskServerIdsArr {
server_id_int, _ := strconv.Atoi(server_id)
jobKey := jobKey(task.Id, server_id_int)
jobs.RemoveJob(jobKey)
}
task.Status = 0
task.Update()
self.ajaxMsg("", MSG_OK)
}
@@ -387,11 +421,14 @@ func (self *TaskController) AjaxRun() {
self.ajaxMsg(err.Error(), MSG_ERR)
}
job, err := jobs.NewJobFromTask(task)
jobArr, err := jobs.NewJobFromTask(task)
if err != nil {
self.ajaxMsg(err.Error(), MSG_ERR)
}
job.Run()
for _, job := range jobArr {
job.Run()
}
self.ajaxMsg("", MSG_OK)
}
@@ -408,9 +445,12 @@ func (self *TaskController) AjaxBatchStart() {
}
if task, err := models.TaskGetById(id); err == nil {
job, err := jobs.NewJobFromTask(task)
jobArr, err := jobs.NewJobFromTask(task)
if err == nil {
jobs.AddJob(task.CronSpec, job)
for _, job := range jobArr {
jobs.AddJob(task.CronSpec, job)
}
task.Status = 1
task.Update()
}
@@ -430,9 +470,17 @@ func (self *TaskController) AjaxBatchPause() {
if id < 1 {
continue
}
jobs.RemoveJob(id)
if task, err := models.TaskGetById(id); err == nil {
task, err := models.TaskGetById(id)
//移出任务
TaskServerIdsArr := strings.Split(task.ServerIds, ",")
for _, server_id := range TaskServerIdsArr {
server_id_int, _ := strconv.Atoi(server_id)
jobKey := jobKey(task.Id, server_id_int)
jobs.RemoveJob(jobKey)
}
if err == nil {
task.Status = 0
task.Update()
}
@@ -451,9 +499,19 @@ func (self *TaskController) AjaxBatchDel() {
if id < 1 {
continue
}
task, _ := models.TaskGetById(id)
//移出任务
TaskServerIdsArr := strings.Split(task.ServerIds, ",")
for _, server_id := range TaskServerIdsArr {
server_id_int, _ := strconv.Atoi(server_id)
jobKey := jobKey(task.Id, server_id_int)
jobs.RemoveJob(jobKey)
}
models.TaskDel(id)
models.TaskLogDelByTaskId(id)
jobs.RemoveJob(id)
}
self.ajaxMsg("", MSG_OK)
}
@@ -661,12 +719,12 @@ func (self *TaskController) ApiTask() {
task_id, _ := self.GetInt("id")
if task_id == 0 {
task := new(models.Task)
task.CreateId,_ = self.GetInt("create_id")
task.CreateId, _ = self.GetInt("create_id")
task.GroupId, _ = self.GetInt("group_id")
task.TaskName = strings.TrimSpace(self.GetString("task_name"))
task.Description = strings.TrimSpace(self.GetString("description"))
task.Concurrent, _ = self.GetInt("concurrent")
task.ServerId, _ = self.GetInt("server_id")
task.ServerIds = strings.TrimSpace(self.GetString("server_ids"))
task.CronSpec = strings.TrimSpace(self.GetString("cron_spec"))
task.Command = strings.TrimSpace(self.GetString("command"))
task.Timeout, _ = self.GetInt("timeout")
@@ -716,7 +774,7 @@ func (self *TaskController) ApiTask() {
task.Description = strings.TrimSpace(self.GetString("description"))
task.GroupId, _ = self.GetInt("group_id")
task.Concurrent, _ = self.GetInt("concurrent")
task.ServerId, _ = self.GetInt("server_id")
task.ServerIds = strings.TrimSpace(self.GetString("server_ids"))
task.CronSpec = strings.TrimSpace(self.GetString("cron_spec"))
task.Command = strings.TrimSpace(self.GetString("command"))
task.Timeout, _ = self.GetInt("timeout")
@@ -724,7 +782,7 @@ func (self *TaskController) ApiTask() {
task.NotifyType, _ = self.GetInt("notify_type")
task.NotifyTplId, _ = self.GetInt("notify_tpl_id")
task.NotifyUserIds = strings.TrimSpace(self.GetString("notify_user_ids"))
task.UpdateId , _ = self.GetInt("update_id")
task.UpdateId, _ = self.GetInt("update_id")
task.Status = 0 //接口不需要
if task.IsNotify == 1 && task.NotifyTplId <= 0 {
@@ -761,15 +819,18 @@ func (self *TaskController) ApiStart() {
self.ajaxMsg("任务状态有误", MSG_ERR)
}
job, err := jobs.NewJobFromTask(task)
jobArr, err := jobs.NewJobFromTask(task)
if err != nil {
self.ajaxMsg("创建任务失败", MSG_ERR)
}
if jobs.AddJob(task.CronSpec, job) {
task.Status = 1
task.Update()
for _, job := range jobArr {
if jobs.AddJob(task.CronSpec, job) {
task.Status = 1
task.Update()
}
}
self.ajaxMsg("", MSG_OK)
}
@@ -784,11 +845,17 @@ func (self *TaskController) ApiPause() {
self.ajaxMsg("查不到该任务", MSG_ERR)
}
jobs.RemoveJob(taskId)
//移出任务
TaskServerIdsArr := strings.Split(task.ServerIds, ",")
for _, server_id := range TaskServerIdsArr {
server_id_int, _ := strconv.Atoi(server_id)
jobKey := jobKey(task.Id, server_id_int)
jobs.RemoveJob(jobKey)
}
task.Status = 0
task.Update()
self.ajaxMsg("", MSG_OK)
}

View File

@@ -8,6 +8,7 @@
package controllers
import (
"fmt"
"github.com/astaxie/beego"
"github.com/george518/PPGo_Job/libs"
"github.com/george518/PPGo_Job/models"
@@ -74,9 +75,12 @@ func (self *TaskLogController) Table() {
for k, v := range result {
row := make(map[string]interface{})
row["id"] = v.Id
row["task_id"] = v.TaskId
row["task_id"] = jobKey(v.TaskId, v.ServerId)
row["start_time"] = beego.Date(time.Unix(v.CreateTime, 0), "Y-m-d H:i:s")
row["process_time"] = float64(v.ProcessTime) / 1000
row["server_id"] = v.ServerId
row["server_name"] = v.ServerName + "#" + strconv.Itoa(v.ServerId)
if v.Status == 0 {
row["output_size"] = libs.SizeFormat(float64(len(v.Output)))
} else {
@@ -99,6 +103,8 @@ func (self *TaskLogController) Detail() {
//日志内容
id, _ := self.GetInt("id")
tasklog, err := models.TaskLogGetById(id)
fmt.Println(tasklog)
if err != nil {
self.Ctx.WriteString("日志不存在")
return
@@ -119,6 +125,8 @@ func (self *TaskLogController) Detail() {
row["output_size"] = libs.SizeFormat(float64(len(tasklog.Error)))
}
row["server_name"] = tasklog.ServerName
row["output"] = tasklog.Output
row["error"] = tasklog.Error
@@ -149,15 +157,31 @@ func (self *TaskLogController) Detail() {
// 分组列表
self.Data["taskGroup"] = taskGroupLists(self.taskGroups, self.userId)
serverName := "本地服务器"
if task.ServerId == 0 {
serverName := ""
if task.ServerIds == "0" {
serverName = "本地服务器"
} else {
server, err := models.TaskServerGetById(task.ServerId)
if err == nil {
serverName = server.ServerName
serverIdSli := strings.Split(task.ServerIds, ",")
for _, v := range serverIdSli {
if v == "0" {
serverName = "本地服务器 "
}
}
servers, n := models.TaskServerGetByIds(task.ServerIds)
if n > 0 {
for _, server := range servers {
if server.Status != 0 {
serverName += server.ServerName + "【无效】 "
} else {
serverName += server.ServerName + " "
}
}
} else {
serverName = "服务器异常!! "
}
}
self.Data["serverName"] = serverName
//任务分组