go第三方定时任务库 cron

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







Guess you like

Origin blog.csdn.net/liao__ran/article/details/121104093