go 任务调度器
公司突然有项目可能会用到项目调度器,跟若依中的项目调度器是一样的功能。之前用过若依但并没有写过理解用过任务调度器,研究若依的任务调度器并仿写使用于go的。
1.数据库表结构 直接用之前若依的
2.库的话没有org.quartz-scheduler.quartz库 就使用“github.com/reugn/go-quartz”
创建映射类 项目初始化启动加载里面的任务
//映射类
type SysJob struct {
JobId int `json:"job_id"`
JobName string `json:"job_name"`
JobGroup string `json:"job_group"`
InvokeTarget string `json:"invoke_target"`
CronExpression string `json:"cron_expression"`
MisfirePolicy string `json:"misfire_policy"`
Concurrent string `json:"concurrent"`
Status string `json:"status"`
CreateBy string `json:"create_by"`
CreateTime string `json:"create_time"`
UpdateBy string `json:"update_by"`
UpdateTime string `json:"update_time"`
Remark string `json:"remark"`
}
//初始化调用的方法
func InitCron() {
var s []SysJob
global.DB.Raw("select * from sys_job").Scan(&s)
for _, i2 := range s {
CreateScheduleJob(i2)
}
}
//创建调度任务器 加载数据库中已存在的任务
func CreateScheduleJob(j SysJob) {
jobGroup := j.JobGroup
jobName := j.JobName + strconv.Itoa(j.JobId)
jk := quartz.NewJobKeyWithGroup(jobName, jobGroup)
request, _ := http.NewRequest(http.MethodGet, "http://localhost:"+strconv.Itoa(global.Settings.Port)+j.InvokeTarget, nil)
JobDetail := quartz.NewJobDetail(job.NewCurlJob(request), jk)
s := quartz.NewStdScheduler()
t, _ := quartz.NewCronTrigger(j.CronExpression)
if _, err := s.GetScheduledJob(jk); err != nil {
_ = s.DeleteJob(jk)
}
_ = s.ScheduleJob(JobDetail, t)
s.Start(context.Background())
if j.Status == "1" {//为1是暂停
s.Stop()
}
}
在quartz.NewJobDetail()方法中参数为func NewJobDetail(job Job, jobKey *JobKey) *JobDetail
第一个参数job有多个实现
job.NewShellJob() //可实现运行shell命令 暂时未用到
job.NewCurlJob()//可发起http请求未用到https
job.NewFunctionJob()该方法参数为NewFunctionJob[R any](function Function[R]) *FunctionJob[R]
示例: funcJob2 := job.NewFunctionJob(func(_ context.Context) (int, error) {
atomic.AddInt32(&n, 2)
return 42, nil
})
若依中调用目标字符串为方法名 go中字符串转方法名我并没有实现,暂时也没找到可行方法 只能通过http调用router中的接口请求实现功能
//实现执行一次任务且立即执行
func RunTrigger() {
jk := quartz.NewJobKeyWithGroup("a", "de")
request, _ := http.NewRequest(http.MethodGet, "http://localhost:"+strconv.Itoa(global.Settings.Port)+"/tasktest", nil)
JobDetail := quartz.NewJobDetail(job.NewCurlJob(request), jk)
t := quartz.NewRunOnceTrigger(0)
s := quartz.NewStdScheduler()
_ = s.ScheduleJob(JobDetail, t)
s.Start(context.Background())
}
停止任务s.PauseJob()
开始任务s.ResumeJob()
修改任务就是调用s.DeleteJob()删了重新建调用CreateScheduleJob()函数即可
添加任务调用CreateScheduleJob()函数即可
删除的话调用s.DeleteJob()
结束!!!