go-quartz: Go的极简和零依赖的cron调度库


Quartz Java 调度程序的启发的调度库。

有大量需要定期运行作业的用例,这种作业可以在后台运行并执行其自定义逻辑以提供最终结果。
特点:

  • 它是一个极简库,这意味着除了 Golang 的内部包(零依赖)之外,它不会导入任何库来执行它。
  • 它提供了运行两种作业的内置功能,即外壳作业、卷曲作业和自定义作业(使用我们的自定义逻辑)。
  • 它还提供了多种触发器,包括简单触发器、Cron 触发器和 RunOnce 触发器。

组成部分:
1、调度器接口
2、已实现的触发器

  • 定时触发
  • 简单触发器
  • 运行一次触发器

3、已实施的worker
  • ShellJob
  • CurlJob

简单案例:
sched := quartz.NewStdScheduler()
sched.Start()
cronTrigger, _ := quartz.NewCronTrigger("1/5 * * * * *")
shellJob := quartz.NewShellJob(
"ls -la")
curlJob, _ := quartz.NewCurlJob(http.MethodGet,
"http://worldclockapi.com/api/json/est/now", "", nil)
sched.ScheduleJob(shellJob, cronTrigger)
sched.ScheduleJob(curlJob, quartz.NewSimpleTrigger(time.Second*7))
sched.Stop()

详细步骤:
为了运行一个作业,我们首先需要初始化go-quartz包的标准调度程序,然后使用sched.Start(). 我们需要向调度程序提供 cron 表达式以及作为我们逻辑的一部分需要执行的命令。

sched := quartz.NewStdScheduler()
sched.Start()    // start scheduler
// creating a trigger with provided cron expression which also checks if the expression is correct or not.
cronTrigger, err := quartz.NewCronTrigger(
"1/3 * * * * *")
if err != nil {
    fmt.Println(err)
    return
}
shellJob := quartz.NewShellJob(
"ls -la")
sched.ScheduleJob(shellJob, cronTrigger)
time.Sleep(time.Second * 10)
// not needed if the server is running.
fmt.Println(sched.GetJobKeys())
// prints keys associated with job.
fmt.Println(shellJob.Result)
// prints result of the shell job.
sched.Stop()

轮询:这是软件包提供的内置功能,如果有定期轮询某些REST API的要求。

sched := quartz.NewStdScheduler()
sched.Start()
// 
curlJob, err := quartz.NewCurlJob(http.MethodGet,
"https://jsonplaceholder.typicode.com/users/1", "", nil)
if err != nil {
    fmt.Println(err)
    return
}
sched.ScheduleJob(curlJob, quartz.NewSimpleTrigger(time.Second*7))
time.Sleep(time.Second * 10)
// not needed if the server is running.
fmt.Println(sched.GetJobKeys())
// prints keys associated with job.
fmt.Println(curlJob.Response)
// prints response receive from API.
sched.Stop()

quartz.NewSimpleTrigger(time.Second*7):人们可以提供以秒、分钟、小时等为单位的时间,定期运行作业。

自定义作业
自定义作业是指我们有一些需要定期执行的自定义逻辑。在schedular.go文件中,我们创建了一个调度器,并为它提供了cron表达式,这将允许它在3秒后执行作业。

scheduler.go
sched := quartz.NewStdScheduler()
sched.Start()
cronTrigger, err := quartz.NewCronTrigger("1/3 * * * * *")
if err != nil {
    fmt.Println(err)
    return
}
cronJob := CronJob{
"Cron job"}
sched.ScheduleJob(&cronJob, cronTrigger)
fmt.Println(scheduledJob.TriggerDescription) 
sched.Stop()

在这里,我们将一个CronJob对象传递给sched.ScheduleJob(),该对象执行所提供的结构和写在cronJob.go中的Execute()方法提供的自定义逻辑。

cronJob.go
// CronJob struct implements quartz package's Job interface{}
type Cronjob struct {
    desc string
}
func (c *CronJob) Key() int {
    return quartz.HashCode(c.instanceID)
}
func (c *CronJob) Description() string{
    return c.desc
}
func (c *CronJob) Execute(){
   
// Your custom logic
}

CronJob内部实现了已经存在于quartz库中的Job接口。当结构被传递给scheduleJob()时,它内部有一个逻辑,可以调用传递给它的结构的Execute()方法,该方法将运行编写的自定义逻辑并为你提供预期的结果。