每一个任务都需要编写一个Crontab命令,这是件很麻烦且很不友好的事情。 任务调度器允许你以代码的形式定义调度命令,并且服务器上只需要一个Crontab命令即可, 任务调度又是我们俗称的 “计划任务”
1.工欲善其事,必先利其器
Github一番搜索,发现Golang有个cron包(robfig/cron)大概满足需求,于是学习一下。
2.介绍
看了一遍文档,cron包支持的已经很全面了~~~不用自己造轮子了。
表达式
兼容Linux的crontab表达式(支持分钟级别)。
日志
可以很详细的记录调度的任务状态
时区
支持任务级别的时区配置
预定义计划
支持在未来指定的时间去运行
线程安全问题
该cron lib管理任务队列的slice没有做并发安全考虑,可能会出现任务竟抢行为。
3.实例
1 | package main |
1 | $ go run . |
4.简单封装
- main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package main
import "cron-example/console"
func main() {
quitChan := make(chan bool, 1)
// console
go func() {
console.Default()
}()
<-quitChan
} - console.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31package console
import (
"log"
"time"
"cron-example/console/commands"
"github.com/robfig/cron"
)
func schedule(c *cron.Cron) {
c.AddFunc("* * * * * *", commands.Test)
}
func Default() {
log.Println("Starting...")
c := cron.New()
c.Start()
schedule(c)
timer := time.NewTimer(time.Second * 10)
for {
select {
case <-timer.C:
timer.Reset(time.Second * 10)
}
}
}