Files
utility_go/internal/logic/systemCron/systemCron.go

306 lines
7.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package systemCron
import (
"context"
"github.com/ayflying/utility_go/api/system/v1"
"github.com/ayflying/utility_go/service2"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcron"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/gtimer"
"sync"
"time"
)
var (
ctx = gctx.New()
)
// sSystemCron 结构体定义了系统定时任务的秒计时器。
// 它包含了不同时间周期的任务,如秒、分钟、小时、天、周、月、年以及特定的工作日任务。
type sSystemCron struct {
//互斥锁
Lock sync.Mutex
// 每秒执行的任务
SecondlyTask []func() error
// 每分钟执行的任务
MinutelyTask []func() error
// 每小时执行的任务
HourlyTask []func() error
// 每天执行的任务
DailyTask []func() error
// 每周执行的任务
WeeklyTask []func() error
// 每月执行的任务
MonthlyTask []func() error
// 每年执行的任务
YearlyTask []func() error
// 每周一执行的任务
MondayTask []func() error
// 每周二执行的任务
TuesdayTask []func() error
// 每周三执行的任务
WednesdayTask []func() error
// 每周四执行的任务
ThursdayTask []func() error
// 每周五执行的任务
FridayTask []func() error
// 每周六执行的任务
SaturdayTask []func() error
// 每周日执行的任务
SundayTask []func() error
}
func New() *sSystemCron {
return &sSystemCron{}
}
func init() {
service2.RegisterSystemCron(New())
}
// AddCron 添加一个定时任务到相应的调度列表中。
//
// @Description: 根据指定的类型将函数添加到不同的任务列表中,以供后续执行。
// @receiver s: sSystemCron的实例代表一个调度系统。
// @param typ: 任务的类型,决定该任务将被添加到哪个列表中。对应不同的时间间隔。
// @param _func: 要添加的任务函数该函数执行时应该返回一个error。
func (s *sSystemCron) AddCron(typ v1.CronType, _func func() error) {
//加锁
s.Lock.Lock()
defer s.Lock.Unlock()
switch typ {
case v1.CronType_SECOND:
s.SecondlyTask = append(s.SecondlyTask, _func) // 将函数添加到每秒执行的任务列表中
case v1.CronType_MINUTE:
s.MinutelyTask = append(s.MinutelyTask, _func) // 将函数添加到每分钟执行的任务列表中
case v1.CronType_HOUR:
s.HourlyTask = append(s.HourlyTask, _func) // 将函数添加到每小时执行的任务列表中
case v1.CronType_DAILY:
s.DailyTask = append(s.DailyTask, _func) // 将函数添加到每日执行的任务列表中
case v1.CronType_WEEK:
s.WeeklyTask = append(s.WeeklyTask, _func) // 将函数添加到每周执行的任务列表中
case v1.CronType_MONTH:
s.MonthlyTask = append(s.MonthlyTask, _func) // 将函数添加到每月执行的任务列表中
case v1.CronType_YEAR:
s.YearlyTask = append(s.YearlyTask, _func) // 将函数添加到每年执行的任务列表中
case v1.CronType_MONDAY:
s.MondayTask = append(s.MondayTask, _func) // 将函数添加到每周一执行的任务列表中
case v1.CronType_TUESDAY:
s.TuesdayTask = append(s.TuesdayTask, _func) // 将函数添加到每周二的任务列表中
case v1.CronType_WEDNESDAY:
s.WednesdayTask = append(s.WednesdayTask, _func) // 将函数添加到每周三执行的任务列表中
case v1.CronType_THURSDAY:
s.ThursdayTask = append(s.ThursdayTask, _func) // 将函数添加到每周四执行的任务列表中
case v1.CronType_FRIDAY:
s.FridayTask = append(s.FridayTask, _func) // 将函数添加到每周五执行的任务列表中
case v1.CronType_SATURDAY:
s.SaturdayTask = append(s.SaturdayTask, _func) // 将函数添加到每周六执行的任务列表中
case v1.CronType_SUNDAY:
s.SundayTask = append(s.SundayTask, _func) // 将函数添加到每周日的任务列表中
}
}
// StartCron 开始计划任务执行
//
// @Description:
// @receiver s
// @return err
func (s *sSystemCron) StartCron() (err error) {
g.Log().Debug(ctx, "启动计划任务定时器详情")
//每秒任务
gtimer.SetInterval(ctx, time.Second, func(ctx context.Context) {
//g.Log().Debug(ctx, "每秒定时器")
err = s.secondlyTask()
})
//每分钟任务
_, err = gcron.AddSingleton(ctx, "0 * * * * *", func(ctx context.Context) {
//g.Log().Debug(ctx, "每分钟定时器")
err = s.minutelyTask()
})
//每小时任务
_, err = gcron.AddSingleton(ctx, "0 0 * * * *", func(ctx context.Context) {
g.Log().Debug(ctx, "每小时定时器")
err = s.hourlyTask()
})
//每天任务
_, err = gcron.AddSingleton(ctx, "0 0 0 * * *", func(ctx context.Context) {
g.Log().Debug(ctx, "每日定时器")
err = s.dailyTask()
})
//每周任务
_, err = gcron.AddSingleton(ctx, "0 0 0 * * 1", func(ctx context.Context) {
g.Log().Debug(ctx, "每周一定时器")
err = s.weeklyTask(1)
})
//每周二任务
_, err = gcron.AddSingleton(ctx, "0 0 0 * * 2", func(ctx context.Context) {
g.Log().Debug(ctx, "每周二定时器")
err = s.weeklyTask(2)
})
//周三任务
_, err = gcron.AddSingleton(ctx, "0 0 0 * * 3", func(ctx context.Context) {
g.Log().Debug(ctx, "周三定时器")
err = s.weeklyTask(3)
})
//周四任务
_, err = gcron.AddSingleton(ctx, "0 0 0 * * 4", func(ctx context.Context) {
g.Log().Debug(ctx, "周四定时器")
err = s.weeklyTask(4)
})
//周五任务
_, err = gcron.AddSingleton(ctx, "0 0 0 * * 5", func(ctx context.Context) {
g.Log().Debug(ctx, "周五定时器")
err = s.fridayTask()
})
//周六任务
_, err = gcron.AddSingleton(ctx, "0 0 0 * * 6", func(ctx context.Context) {
g.Log().Debug(ctx, "周六定时器")
err = s.weeklyTask(6)
})
//周日任务
_, err = gcron.AddSingleton(ctx, "0 0 0 * * 0", func(ctx context.Context) {
g.Log().Debug(ctx, "周日定时器")
err = s.weeklyTask(7)
})
//每月任务
_, err = gcron.AddSingleton(ctx, "0 0 0 1 * *", func(ctx context.Context) {
g.Log().Debug(ctx, "每月定时器")
err = s.monthlyTask()
})
_, err = gcron.AddSingleton(ctx, "0 0 0 1 1 *", func(ctx context.Context) {
g.Log().Debug(ctx, "每年定时器")
err = s.monthlyTask()
})
return
}
// 每妙任务
func (s *sSystemCron) secondlyTask() (err error) {
if len(s.SecondlyTask) == 0 {
return
}
for _, _func := range s.SecondlyTask {
err = _func()
if err != nil {
g.Log().Error(ctx, err)
}
}
return
}
// 每分钟任务
func (s *sSystemCron) minutelyTask() (err error) {
if len(s.MinutelyTask) == 0 {
return
}
for _, _func := range s.MinutelyTask {
err = _func()
if err != nil {
g.Log().Error(ctx, err)
}
}
return
}
// 每小时任务
func (s *sSystemCron) hourlyTask() (err error) {
if len(s.HourlyTask) == 0 {
return
}
for _, _func := range s.HourlyTask {
err = _func()
if err != nil {
g.Log().Error(ctx, err)
}
}
return
}
// 每天任务
func (s *sSystemCron) dailyTask() (err error) {
if len(s.DailyTask) == 0 {
return
}
for _, _func := range s.DailyTask {
err = _func()
if err != nil {
g.Log().Error(ctx, err)
}
}
return
}
// 每周任务
func (s *sSystemCron) weeklyTask(day int) (err error) {
var arr []func() error
switch day {
case 1:
arr = s.MondayTask
case 2:
arr = s.TuesdayTask
case 3:
arr = s.WednesdayTask
case 4:
arr = s.ThursdayTask
case 5:
arr = s.FridayTask
case 6:
arr = s.SaturdayTask
case 7:
arr = s.SundayTask
default:
arr = s.WeeklyTask
return
}
if len(arr) == 0 {
return
}
for _, _func := range arr {
err = _func()
if err != nil {
g.Log().Error(ctx, err)
}
}
return
}
// 周五任务
func (s *sSystemCron) fridayTask() (err error) {
if len(s.FridayTask) == 0 {
return
}
for _, _func := range s.FridayTask {
err = _func()
if err != nil {
g.Log().Error(ctx, err)
}
}
return
}
// 每月任务
func (s *sSystemCron) monthlyTask() (err error) {
if len(s.MonthlyTask) == 0 {
return
}
for _, _func := range s.MonthlyTask {
err = _func()
if err != nil {
g.Log().Error(ctx, err)
}
}
return
}