受Quartz Java 调度程序的启发的调度库。
有大量需要定期运行作业的用例,这种作业可以在后台运行并执行其自定义逻辑以提供最终结果。
特点:
- 它是一个极简库,这意味着除了 Golang 的内部包(零依赖)之外,它不会导入任何库来执行它。
- 它提供了运行两种作业的内置功能,即外壳作业、卷曲作业和自定义作业(使用我们的自定义逻辑)。
- 它还提供了多种触发器,包括简单触发器、Cron 触发器和 RunOnce 触发器。
组成部分:
1、调度器接口
2、已实现的触发器
3、已实施的worker
简单案例:
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()方法,该方法将运行编写的自定义逻辑并为你提供预期的结果。