• Go语言中定时任务库Cron使用详解


    原创不易,未经允许,请勿转载。

    文章目录

    快速入门

    安装cron,注意这里安装的是v3版本。新版本和旧版时间使用有所区别

    go get github.com/robfig/cron/v3@v3.0.0
    
    • 1

    在项目中导入

    import "github.com/robfig/cron/v3"
    
    • 1

    v3版本的github.com/robfig/cron/v3默认解析器符合Cron 维基百科页面所描述的标准
    用法大致如下

    package main
    
    import (
    	"fmt"
    	"github.com/robfig/cron/v3"
    )
    
    func main() {
    	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(".. in the range 3-6am, 8-11pm") })
    	c.AddFunc("CRON_TZ=Asia/Tokyo 30 04 * * *", func() { fmt.Println("Runs at 04:30 Tokyo time every day") })
    	c.AddFunc("@hourly", func() { fmt.Println("Every hour, starting an hour from now") })
    	c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty, starting an hour thirty from now") })
    	c.Start()
    	select {}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Cron表达式格式

    一个 cron 表达式表示一组时间,使用 5 个空格分隔的字段。这是v3版本默认支持的格式。

    Field name   | Mandatory? | Allowed values  | Allowed special characters
    ----------   | ---------- | --------------  | --------------------------
    Minutes      | Yes        | 0-59            | * / , -
    Hours        | Yes        | 0-23            | * / , -
    Day of month | Yes        | 1-31            | * / , - ?
    Month        | Yes        | 1-12 or JAN-DEC | * / , -
    Day of week  | Yes        | 0-6 or SUN-SAT  | * / , - ?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如果要想在v3版本中也支持秒级别的解析,需要自定义解析器。代码如下

    Field name   | Mandatory? | Allowed values  | Allowed special characters
    ----------   | ---------- | --------------  | --------------------------
    Seconds      | Yes        | 0-59            | * / , -
    Minutes      | Yes        | 0-59            | * / , -
    Hours        | Yes        | 0-23            | * / , -
    Day of month | Yes        | 1-31            | * / , - ?
    Month        | Yes        | 1-12 or JAN-DEC | * / , -
    Day of week  | Yes        | 0-6 or SUN-SAT  | * / , - ?
    
    
    func main() {
    // Seconds field, required
    cron.New(cron.WithSeconds())
    
    // Seconds field, optional
    cron.New(cron.WithParser(cron.NewParser(
    	cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor,
    )))
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    预定义时间表

    可以用@yearly@monthly@weekly@weekly@daily@hourly来替代cron表达式。分别表示每年,每月、每星期、每天、每小时。
    还可以用@every 来表示间隔时间,即间隔执行一次任务。只要可以被time.ParseDuration()解析即可

    设置时区

    func main() {
    
    cron.New(
        cron.WithLocation(time.UTC))
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    常用的方法介绍

    New()

    package main
    
    import (
    	"fmt"
    	"github.com/robfig/cron/v3"
    )
    
    func main() {
        // 创建一个默认的cron对象
    	c := cron.New()
    
        
        // 自定义解析器
        cron.New(cron.WithSeconds())
    
        // Seconds field, optional
        cron.New(cron.WithParser(cron.NewParser(
            cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor,
        )))
        
    	select {}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    AddJob()

    // 有两个参数,第一个参数可以是cron表达式或者预定义时间表,第二个Job
    func (c *Cron) AddJob(spec string, cmd Job) (EntryID, error)
    
    // Job是一个接口,有一个Run方法
    type Job interface {
    	Run()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    自定义个一个func类型,实现Run方法。不过一般可以直接用下面讲的AddFunc方法即可

    package main
    
    import (
    	"fmt"
    	"github.com/robfig/cron/v3"
    )
    
    type MyJob func()
    
    func (f MyJob) Run() {
    	fmt.Println("myJob")
    }
    
    func main() {
    	c := cron.New()
    	c.AddJob("@every 1s", MyJob(func() {
    		fmt.Println("myjob")
    	}))
    	c.Start()
    	select {}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    AddFunc()

    // 有两个参数,第一个参数可以是cron表达式或者预定义时间表,第二个传入一个函数,就是要执行的任务
    // 会返回一个Id和error
    // 会把传入的cmd func转成FuncJob。FuncJob实现了Job接口
    func (c *Cron) AddFunc(spec string, cmd func()) (EntryID, error) {
    	return c.AddJob(spec, FuncJob(cmd))
    }
    
    
    package main
    
    import (
    	"fmt"
    	"github.com/robfig/cron/v3"
    )
    
    func main() {
    	c := cron.New()
    	Id, err := c.AddFunc("30 * * * *", func() { fmt.Println("Every hour on the half hour") })
    	
        // Id可以用做取消任务
        c.Remove(Id)
    	select {}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    Start()
    调用start方法开始执行任务

    func main() {
    	c := cron.New()
    	c.AddJob("@every 1s", MyJob(func() {
    		fmt.Println("myjob")
    	}))
    	c.AddFunc()
    	c.Start()
    	select {}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果这篇文章对您有所帮助,麻烦点个一键三连。

    原创不易,未经允许,请勿转载。

    博客主页:https://xiaojujiang.blog.csdn.net/

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    STM32定时器输入捕获测量高电平时间
    前端学成在线项目详细解析三
    oracle数据库核心知识
    OpenCV(三十一):形态学操作
    Django国际化与本地化指南
    NK-RTU980 CAP
    第五章:方法
    使用react-sizeme解决react-grid-layout中侧栏(抽屉)展开或隐藏时不会自适应容器大小的问题
    012 C++ AVL_tree
    Ansible
  • 原文地址:https://blog.csdn.net/m0_67401746/article/details/126083431