性能优化: 当任务较多时, gocron启动慢

develop
ouqiang 2018-01-30 21:16:44 +08:00
parent 94c9963e81
commit 3ed64f9f22
3 changed files with 31 additions and 15 deletions

View File

@ -120,9 +120,11 @@ func (task *Task) Enable(id int) (int64, error) {
} }
// 获取所有激活任务 // 获取所有激活任务
func (task *Task) ActiveList() ([]Task, error) { func (task *Task) ActiveList(page, pageSize int) ([]Task, error) {
params := CommonMap{"Page": page, "PageSize": pageSize}
task.parsePageAndPageSize(params)
list := make([]Task, 0) list := make([]Task, 0)
err := Db.Where("status = ? AND level = ?", Enabled, TaskLevelParent). err := Db.Where("status = ? AND level = ?", Enabled, TaskLevelParent).Limit(task.PageSize, task.pageLimitOffset()).
Find(&list) Find(&list)
if err != nil { if err != nil {

View File

@ -299,7 +299,7 @@ func addTaskToTimer(id int) {
return return
} }
service.ServiceTask.Add(task) service.ServiceTask.RemoveAndAdd(task)
} }
// 解析查询参数 // 解析查询参数

View File

@ -95,26 +95,42 @@ type TaskResult struct {
// 初始化任务, 从数据库取出所有任务, 添加到定时任务并运行 // 初始化任务, 从数据库取出所有任务, 添加到定时任务并运行
func (task Task) Initialize() { func (task Task) Initialize() {
logger.Info("开始初始化定时任务")
taskModel := new(models.Task) taskModel := new(models.Task)
taskList, err := taskModel.ActiveList() taskNum := 0
page := 1
pageSize := 1000
maxPage := 1000
for page < maxPage {
taskList, err := taskModel.ActiveList(page, pageSize)
if err != nil { if err != nil {
logger.Error("定时任务初始化#获取任务列表错误-", err.Error()) logger.Fatalf("定时任务初始化#获取任务列表错误-", err.Error())
return
} }
if len(taskList) == 0 { if len(taskList) == 0 {
logger.Debug("任务列表为空") break
return
} }
task.BatchAdd(taskList) for _, item := range taskList {
task.Add(item)
taskNum++
}
page++
}
logger.Infof("定时任务初始化完成, 共%d个定时任务添加到调度器", taskNum)
} }
// 批量添加任务 // 批量添加任务
func (task Task) BatchAdd(tasks []models.Task) { func (task Task) BatchAdd(tasks []models.Task) {
for _, item := range tasks { for _, item := range tasks {
task.Add(item) task.RemoveAndAdd(item)
} }
} }
// 删除任务后添加
func (task Task) RemoveAndAdd(taskModel models.Task) {
task.Remove(taskModel.Id)
task.Add(taskModel)
}
// 添加任务 // 添加任务
func (task Task) Add(taskModel models.Task) { func (task Task) Add(taskModel models.Task) {
if taskModel.Level == models.TaskLevelChild { if taskModel.Level == models.TaskLevelChild {
@ -128,8 +144,6 @@ func (task Task) Add(taskModel models.Task) {
} }
cronName := strconv.Itoa(taskModel.Id) cronName := strconv.Itoa(taskModel.Id)
// Cron任务采用数组存储, 删除任务需遍历数组, 并对数组重新赋值, 任务较多时,有性能问题
serviceCron.RemoveJob(cronName)
err := serviceCron.AddFunc(taskModel.Spec, taskFunc, cronName) err := serviceCron.AddFunc(taskModel.Spec, taskFunc, cronName)
if err != nil { if err != nil {
logger.Error("添加任务到调度器失败#", err) logger.Error("添加任务到调度器失败#", err)