fix: 修复定时任务关闭不生效问题
This commit is contained in:
@@ -11,11 +11,11 @@ import (
|
||||
var c *cron.Cron
|
||||
|
||||
// 任务队列
|
||||
var queueMap map[string]Queue
|
||||
var queueMap map[string]*Queue
|
||||
|
||||
// StartCron 启动调度任务实例
|
||||
func StartCron() {
|
||||
queueMap = make(map[string]Queue)
|
||||
queueMap = make(map[string]*Queue)
|
||||
c = cron.New(cron.WithSeconds())
|
||||
c.Start()
|
||||
}
|
||||
@@ -26,22 +26,22 @@ func StopCron() {
|
||||
}
|
||||
|
||||
// CreateQueue 创建队列注册处理器
|
||||
func CreateQueue(name string, processor QueueProcessor) Queue {
|
||||
func CreateQueue(name string, processor QueueProcessor) *Queue {
|
||||
queue := Queue{
|
||||
Name: name,
|
||||
Processor: processor,
|
||||
Job: &[]*QueueJob{},
|
||||
Processor: &processor,
|
||||
Job: []QueueJob{},
|
||||
}
|
||||
queueMap[name] = queue
|
||||
return queue
|
||||
queueMap[name] = &queue
|
||||
return &queue
|
||||
}
|
||||
|
||||
// GetQueue 通过名称获取队列实例
|
||||
func GetQueue(name string) Queue {
|
||||
func GetQueue(name string) *Queue {
|
||||
if v, ok := queueMap[name]; ok {
|
||||
return v
|
||||
}
|
||||
return Queue{}
|
||||
return nil
|
||||
}
|
||||
|
||||
// QueueNames 获取注册的队列名称
|
||||
@@ -56,8 +56,8 @@ func QueueNames() []string {
|
||||
// Queue 任务队列
|
||||
type Queue struct {
|
||||
Name string // 队列名
|
||||
Processor QueueProcessor
|
||||
Job *[]*QueueJob
|
||||
Processor *QueueProcessor
|
||||
Job []QueueJob
|
||||
}
|
||||
|
||||
// QueueProcessor 队列处理函数接口
|
||||
@@ -70,12 +70,12 @@ type QueueProcessor interface {
|
||||
|
||||
// RunJob 运行任务,data是传入的数据
|
||||
func (q *Queue) RunJob(data any, opts JobOptions) int {
|
||||
job := &QueueJob{
|
||||
job := QueueJob{
|
||||
Status: Waiting,
|
||||
Data: data,
|
||||
Opts: opts,
|
||||
queueName: q.Name,
|
||||
queueProcessor: &q.Processor,
|
||||
queueProcessor: q.Processor,
|
||||
}
|
||||
|
||||
// 非重复任务立即执行
|
||||
@@ -86,11 +86,9 @@ func (q *Queue) RunJob(data any, opts JobOptions) int {
|
||||
return Active
|
||||
}
|
||||
// 从切片 jobs 中删除指定索引位置的元素
|
||||
for i, v := range *q.Job {
|
||||
for i, v := range q.Job {
|
||||
if v.cid == 0 {
|
||||
jobs := *q.Job
|
||||
jobs = append(jobs[:i], jobs[i+1:]...)
|
||||
*q.Job = jobs
|
||||
q.Job = append(q.Job[:i], q.Job[i+1:]...)
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -101,27 +99,25 @@ func (q *Queue) RunJob(data any, opts JobOptions) int {
|
||||
// 添加新任务
|
||||
cid, err := c.AddJob(opts.Cron, job)
|
||||
if err != nil {
|
||||
newLog.Error(err, "err")
|
||||
cronLog.Error(err, "err")
|
||||
job.Status = Failed
|
||||
}
|
||||
job.cid = cid
|
||||
}
|
||||
|
||||
*q.Job = append(*q.Job, job)
|
||||
newLog.Info("RunJob", job.cid, opts.JobId, job.Status)
|
||||
q.Job = append(q.Job, job)
|
||||
cronLog.Info("RunJob", job.cid, opts.JobId, job.Status)
|
||||
return job.Status
|
||||
}
|
||||
|
||||
// RemoveJob 移除任务
|
||||
func (q *Queue) RemoveJob(jobId string) bool {
|
||||
for i, v := range *q.Job {
|
||||
func (q *Queue) RemoveJob(jobId int64) bool {
|
||||
for i, v := range q.Job {
|
||||
if jobId == v.Opts.JobId {
|
||||
newLog.Info("RemoveJob", v.cid, jobId, v.Status)
|
||||
cronLog.Info("RemoveJob", v.cid, jobId, v.Status)
|
||||
c.Remove(v.cid)
|
||||
// 从切片 jobs 中删除指定索引位置的元素
|
||||
jobs := *q.Job
|
||||
jobs = append(jobs[:i], jobs[i+1:]...)
|
||||
*q.Job = jobs
|
||||
q.Job = append(q.Job[:i], q.Job[i+1:]...)
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -138,7 +134,7 @@ const (
|
||||
|
||||
// JobOptions 任务参数信息
|
||||
type JobOptions struct {
|
||||
JobId string // 执行任务编号
|
||||
JobId int64 // 执行任务编号
|
||||
Cron string // 重复任务cron表达式
|
||||
}
|
||||
|
||||
@@ -149,30 +145,29 @@ type QueueJob struct {
|
||||
Data any // 执行任务时传入的参数
|
||||
Opts JobOptions
|
||||
|
||||
cid cron.EntryID // 执行ID
|
||||
|
||||
queueName string //队列名
|
||||
queueProcessor *QueueProcessor
|
||||
cid cron.EntryID // 执行ID
|
||||
queueName string // 队列名
|
||||
queueProcessor *QueueProcessor // 队列处理器接口实现
|
||||
}
|
||||
|
||||
// GetJob 获取当前执行任务
|
||||
func (job *QueueJob) GetJob(repeat bool) *QueueJob {
|
||||
q := GetQueue(job.queueName)
|
||||
for _, v := range *q.Job {
|
||||
if repeat && v.Opts.JobId == job.Opts.JobId {
|
||||
func (qj QueueJob) GetJob(repeat bool) QueueJob {
|
||||
q := GetQueue(qj.queueName)
|
||||
for _, v := range q.Job {
|
||||
if repeat && v.Opts.JobId == qj.Opts.JobId {
|
||||
return v
|
||||
}
|
||||
if !repeat && v.cid == 0 {
|
||||
return v
|
||||
}
|
||||
}
|
||||
return job
|
||||
return qj
|
||||
}
|
||||
|
||||
// Run 实现的接口函数
|
||||
func (s QueueJob) Run() {
|
||||
func (qj QueueJob) Run() {
|
||||
// 检查当前任务
|
||||
job := s.GetJob(s.cid != 0)
|
||||
job := qj.GetJob(qj.cid != 0)
|
||||
|
||||
// Active 状态不执行
|
||||
if job.Status == Active {
|
||||
@@ -187,23 +182,23 @@ func (s QueueJob) Run() {
|
||||
err = fmt.Errorf("%v", r)
|
||||
}
|
||||
job.Status = Failed
|
||||
newLog.Error(err, "failed", job)
|
||||
cronLog.Error(err, "failed", job)
|
||||
}
|
||||
}()
|
||||
|
||||
// 开始执行
|
||||
job.Status = Active
|
||||
job.Timestamp = time.Now().UnixMilli()
|
||||
newLog.Info("run", job.cid, job.Opts.JobId)
|
||||
cronLog.Info("run", job.cid, job.Opts.JobId)
|
||||
|
||||
// 获取队列处理器接口实现
|
||||
processor := *job.queueProcessor
|
||||
result, err := processor.Execute(job.Data)
|
||||
if err != nil {
|
||||
job.Status = Failed
|
||||
newLog.Error(err, "failed", job)
|
||||
cronLog.Error(err, "failed", job)
|
||||
} else {
|
||||
job.Status = Completed
|
||||
newLog.Completed(result, "completed", job)
|
||||
cronLog.Completed(result, "completed", job)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user