task bug fix

This commit is contained in:
liuzhihang1
2025-02-23 23:23:02 +08:00
parent fe935fcc3e
commit 0f41d11aec
3 changed files with 55 additions and 27 deletions

View File

@@ -3,6 +3,7 @@ package logic
import ( import (
"context" "context"
"errors" "errors"
"fmt"
"sync" "sync"
"time" "time"
@@ -35,9 +36,9 @@ func (t *taskLogic) InitTaskJob() {
Task: &v, Task: &v,
StartTime: time.Now(), StartTime: time.Now(),
} }
if tj.Task.Cron != nil { if tj.Task.Cron != "" {
c := cron.New() c := cron.New()
_, err := c.AddFunc(*v.Cron, t.cronHandle(tj)) _, err := c.AddFunc(v.Cron, t.cronHandle(tj))
if err != nil { if err != nil {
log.Logger.Errorw("定时任务创建失败", "err", err, "id", v.Id) log.Logger.Errorw("定时任务创建失败", "err", err, "id", v.Id)
continue continue
@@ -118,13 +119,13 @@ func (t *taskLogic) CreateTask(data model.Task) error {
Task: &data, Task: &data,
StartTime: time.Now(), StartTime: time.Now(),
} }
if data.Cron != nil { if data.Cron != "" {
if _, err := cron.ParseStandard(*data.Cron); err != nil { // cron表达式校验 if _, err := cron.ParseStandard(data.Cron); err != nil { // cron表达式校验
log.Logger.Errorw("cron解析失败", "cron", *data.Cron, "err", err) log.Logger.Errorw("cron解析失败", "cron", data.Cron, "err", err)
return err return err
} else { } else {
c := cron.New() c := cron.New()
c.AddFunc(*data.Cron, t.cronHandle(tj)) c.AddFunc(data.Cron, t.cronHandle(tj))
tj.Cron = c tj.Cron = c
} }
} }
@@ -140,28 +141,51 @@ func (t *taskLogic) CreateTask(data model.Task) error {
func (t *taskLogic) EditTask(data model.Task) error { func (t *taskLogic) EditTask(data model.Task) error {
tj, err := t.getTaskJob(data.Id) tj, err := t.getTaskJob(data.Id)
if err != nil { if err != nil {
return errors.New("don't exist this task id") return fmt.Errorf("task with id %v does not exist", data.Id)
} }
if tj.Running { if tj.Running {
return errors.New("can't edit when task is running") return errors.New("can't edit task while it is running")
} }
tj.Cron.Stop()
// 如果 Cron 已经存在,停止并清理
if tj.Cron != nil {
tj.Cron.Stop()
tj.Cron = nil
}
// 更新任务
tj.Task = &data tj.Task = &data
if tj.Task.Cron != nil {
if _, err := cron.ParseStandard(*tj.Task.Cron); err != nil { // 如果 Cron 字段为空,直接禁用任务并返回
return err if tj.Task.Cron == "" {
} tj.Task.Enable = false
c := cron.New() return repository.TaskRepository.EditTask(data)
_, err := c.AddFunc(*data.Cron, t.cronHandle(tj))
if err != nil {
log.Logger.Errorw("定时任务创建失败", "err", err, "id", data.Id)
return err
}
if data.Enable {
c.Start()
}
tj.Cron = c
} }
// 校验 Cron 表达式
if _, err := cron.ParseStandard(tj.Task.Cron); err != nil {
tj.Task.Enable = false
return fmt.Errorf("invalid cron expression: %v", err)
}
// 创建 Cron 调度器
c := cron.New()
_, err = c.AddFunc(data.Cron, t.cronHandle(tj))
if err != nil {
log.Logger.Errorw("failed to create cron job", "err", err, "id", data.Id)
tj.Task.Enable = false
return fmt.Errorf("failed to create cron job: %v", err)
}
// 启动 Cron 调度器
if data.Enable {
c.Start()
}
tj.Cron = c
// 更新任务到数据库
return repository.TaskRepository.EditTask(data) return repository.TaskRepository.EditTask(data)
} }
@@ -170,14 +194,18 @@ func (t *taskLogic) EditTaskEnable(id int, status bool) error {
if err != nil { if err != nil {
return errors.New("don't exist this task id") return errors.New("don't exist this task id")
} }
tj.Task.Enable = status
repository.TaskRepository.EditTaskEnable(id, status)
if tj.Cron != nil { if tj.Cron != nil {
if status { if status {
tj.Cron.Start() tj.Cron.Start()
} else { } else {
tj.Cron.Stop() tj.Cron.Stop()
} }
} else if status {
return errors.New("cron job create failed")
}
if err := repository.TaskRepository.EditTaskEnable(id, status); err != nil {
return err
} }
return nil return nil
} }

View File

@@ -59,8 +59,8 @@ func (p *waitCond) WaitGetMiddel(c *gin.Context) {
} }
func (p *waitCond) WaitTriggerMiddel(c *gin.Context) { func (p *waitCond) WaitTriggerMiddel(c *gin.Context) {
defer p.Trigger()
c.Next() c.Next()
p.Trigger()
} }
func (p *waitCond) timing() { // 添加定时信号清理阻塞协程 func (p *waitCond) timing() { // 添加定时信号清理阻塞协程

View File

@@ -18,7 +18,7 @@ type Task struct {
TriggerEvent *constants.ProcessState `gorm:"column:trigger_event;" json:"triggerEvent" ` TriggerEvent *constants.ProcessState `gorm:"column:trigger_event;" json:"triggerEvent" `
TriggerTarget *int `gorm:"column:trigger_target;" json:"triggerTarget" ` TriggerTarget *int `gorm:"column:trigger_target;" json:"triggerTarget" `
OperationTarget int `gorm:"column:operation_target;NOT NULL" json:"operationTarget" ` OperationTarget int `gorm:"column:operation_target;NOT NULL" json:"operationTarget" `
Cron *string `gorm:"column:cron;" json:"cron" ` Cron string `gorm:"column:cron;" json:"cron" `
Enable bool `gorm:"column:enable;" json:"enable" ` Enable bool `gorm:"column:enable;" json:"enable" `
ApiEnable bool `gorm:"column:api_enable;" json:"apiEnable" ` ApiEnable bool `gorm:"column:api_enable;" json:"apiEnable" `
Key *string `gorm:"column:key;" json:"key" ` Key *string `gorm:"column:key;" json:"key" `