package main
import (
"fmt"
"github.com/robfig/cron/v3"
"log"
"os"
"time"
)
func main() {
simpleUse()
}
func simpleUse() {
// 创建定时任务对象,并加载自定义的日志格式
c := cron.New(
cron.WithLogger(
cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))))
// 向管理器中添加定时任务
// @every 1s表示每秒触发一次, @every 1h1m2s表示1小时1分1秒
c.AddFunc("@every 1s", func() {
fmt.Println("tick every 1 second")
})
// 每半小时执行一次
c.AddFunc("30 * * * *", func() {
fmt.Println("Every hour on the half hour")
})
// 每小时执行一次
c.AddFunc("@hourly", func() {
fmt.Println("Every hour")
})
每秒执行一次
//c := cron.New(cron.WithSeconds())
//c.AddFunc("1 * * * * *", func () {
// fmt.Println("every 1 second")
//})
// 启动定时循环,新goroutine循环检测
c.Start()
// 睡眠,防止goroutine退出
// time.Sleep(time.Second * 1)
for {
time.Sleep(time.Second)
}
}
func knowledgePoints() {
// 时间格式
// Minutes:分钟,取值范围[0-59],支持特殊字符* / , -;
// Hours:小时,取值范围[0-23],支持特殊字符* / , -;
// Day of month:每月的第几天,取值范围[1-31],支持特殊字符* / , - ?;
// Month:月,取值范围[1-12]或者使用月份名字缩写[JAN-DEC],支持特殊字符* / , -;
// Day of week:周历,取值范围[0-6]或名字缩写[JUN-SAT],支持特殊字符* / , - ?。
// 特殊字符含义
// *:使用*的域可以匹配任何值,例如将月份域(第 4 个)设置为*,表示每个月;
// /:用来指定范围的步长,例如将小时域(第 2 个)设置为3-59/15表示第 3 分钟触发,以后每隔 15 分钟触发一次,因此第 2 次触发为第 18 分钟,第 3 次为 33 分钟。。。直到分钟大于 59;
// ,:用来列举一些离散的值和多个范围,例如将周历的域(第 5 个)设置为MON,WED,FRI表示周一、三和五;
// -:用来表示范围,例如将小时的域(第 1 个)设置为9-17表示上午 9 点到下午 17 点(包括 9 和 17);
// ?:只能用在月历和周历的域中,用来代替*,表示每月/周的任意一天。
// 任意定制时间示例
// 30 * * * *:分钟域为 30,其他域都是*表示任意。每小时的 30 分触发;
// 30 3-6,20-23 * * *:分钟域为 30,小时域的3-6,20-23表示 3 点到 6 点和 20 点到 23 点。3,4,5,6,20,21,22,23 时的 30 分触发;
// 0 0 1 1 *:1(第 4 个) 月 1(第 3 个) 号的 0(第 2 个) 时 0(第 1 个) 分触发。
// 预定义时间规则
// @yearly:也可以写作@annually,表示每年第一天的 0 点。等价于0 0 1 1 *;
// @monthly:表示每月第一天的 0 点。等价于0 0 1 * *;
// @weekly:表示每周第一天的 0 点,注意第一天为周日,即周六结束,周日开始的那个 0 点。等价于0 0 * * 0;
// @daily:也可以写作@midnight,表示每天 0 点。等价于0 0 * * *;
// @hourly:表示每小时的开始。等价于0 * * * *。
// 固定时间间隔,每隔duration触发一次
// @every <duration>
// 时区
//在时间字符串前面添加一个CRON_TZ= + 具体时区,具体时区的格式在之前carbon的文章中有详细介绍。东京时区为Asia/Tokyo,纽约时区为America/New_York;
//创建cron对象时增加一个时区选项cron.WithLocation(location),location为time.LoadLocation(zone)加载的时区对象,zone为具体的时区格式。或者调用已创建好的cron对象的SetLocation()方法设置时区。
// 选项
//cron对象创建使用了选项模式,我们前面已经介绍了 3 个选项:
//WithLocation:指定时区;
//WithParser:使用自定义的解析器;
//WithSeconds:让时间格式支持秒,实际上内部调用了WithParser。
//cron还提供了另外两种选项:
//WithLogger:自定义Logger;
//WithChain:Job 包装器。
}
func knowledgeUse() {
c := cron.New()
// 任意定制时间
c.AddFunc("30 * * * *", func() {
fmt.Println("Every hour on the half hour")
})
c.AddFunc("30 3-6,20-23 * * *", func() {
fmt.Println("On the half hour of 3-6am, 8-11pm")
})
c.AddFunc("0 0 1 1 *", func() {
fmt.Println("Jun 1 every year")
})
// 预定义时间
c.AddFunc("@hourly", func() {
fmt.Println("Every hour")
})
c.AddFunc("@daily", func() {
fmt.Println("Every day on midnight")
})
c.AddFunc("@weekly", func() {
fmt.Println("Every week")
})
// 固定时间间隔
// @every 1s表示每秒触发一次, @every 1h1m2s表示1小时1分1秒
c.AddFunc("@every 1s", func() {
fmt.Println("tick every 1 second")
})
// 时区
//nyc, _ := time.LoadLocation("America/New_York")
//c := cron.New(cron.WithLocation(nyc))
//c.AddFunc("0 6 * * ?", func() {
// fmt.Println("Every 6 o'clock at New York")
//})
//c.AddFunc("CRON_TZ=Asia/Tokyo 0 6 * * ?", func() {
// fmt.Println("Every 6 o'clock at Tokyo")
//})
// 自定义时间格式 cron.NewParser()创建自己的Parser对象,使其支持到秒
//parser := cron.NewParser(
// cron.Second | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor,
//)
cron.WithParser(parser)创建一个选项传入构造函数cron.New()
//c := cron.New(cron.WithParser(parser))
//c.AddFunc("1 * * * * *", func () {
// fmt.Println("every 1 second")
//})
// 当定位到秒时也可以不使用Parser对象,直接使用其他,如下
//c := cron.New(cron.WithSeconds())
//c.AddFunc("1 * * * * *", func () {
// fmt.Println("every 1 second")
//})
// 自定义的Logger
//c := cron.New(
// cron.WithLogger(
// cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))))
//c.AddFunc("@every 1s", func() {
// fmt.Println("hello world")
//})
c.Start()
for {
time.Sleep(time.Second)
}
}
//参考: https://segmentfault.com/a/1190000023029219
go第三方定时任务库 cron
最新推荐文章于 2024-08-16 17:05:05 发布