mirror of
https://github.com/lzh-1625/go_process_manager.git
synced 2025-10-05 16:06:51 +08:00
task bug fix
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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() { // 添加定时信号清理阻塞协程
|
||||||
|
@@ -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" `
|
||||||
|
Reference in New Issue
Block a user