go 任务调度器

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()
结束!!!

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值