GO定时任务CRON执行不成功?看一下这篇文章就明白了

科工人
• 阅读 2881

背景描述

碰到一个需求,需要起一个定时任务,由于最近在熟悉go语言,所以想用go来实现这个需求。

搜索go定时任务框架,官方推荐的框架是cron,文档地址是https://godoc.org/github.com/robfig/cron

官方示例如下

Usage Callers may register Funcs to be invoked on a given schedule. Cron will run them in their own goroutines.

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()
..
// Funcs are invoked in their own goroutine, asynchronously.
...
// Funcs may also be added to a running Cron
c.AddFunc("@daily", func() { fmt.Println("Every day") })
..
// Inspect the cron job entries' next and previous run times.
inspect(c.Entries())
..
c.Stop()  // Stop the scheduler (does not stop any jobs already running).

问题描述

按照官方示例,写了以下demo,测试定时任务是否可以运行成功

package main

import (
    "fmt"

    "github.com/robfig/cron/v3"
)

func main() {
    // 每隔3秒执行一次:*/3 * * * * *
    spec := "*/3 * * * * *"
    c := cron.New()
    c.AddFunc(spec, func() {
        fmt.Println("每隔3秒执行一次")
    })
    go c.Start()
    defer c.Stop()
    select {}
}

释: select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。 select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。

运行上述代码,发现定时任务并没有每隔3s打印输出一次

crond 表达式解释,如下图

GO定时任务CRON执行不成功?看一下这篇文章就明白了

解决方案

这是因为"github.com/robfig/cron/v3"与"github.com/robfig/cron"包的差异造成的,实际上在v3的文档中有以下描述

Since adding Seconds is the most common modification to the standard cron spec, cron provides a builtin function to do that, which is equivalent to the custom parser you saw earlier, except that its seconds field is REQUIRED:

cron.New(cron.WithSeconds())

说明cron v3版本默认已经不再是支持到秒级别的定时了。

解决方案一:

使用老版本的cron包

package main

import (
    "fmt"

    "github.com/robfig/cron"
)

func main() {
    // 每隔3秒执行一次:*/3 * * * * *
    spec := "*/3 * * * * *"
    c := cron.New()
    c.AddFunc(spec, func() {
        fmt.Println("每隔3秒执行一次")
    })
    go c.Start()
    defer c.Stop()
    select {}
}

解决方案二:

使用新版本的cron包,但是要cron.New(cron.WithSeconds())方法

package main

import (
    "fmt"

    "github.com/robfig/cron/v3"
)

func main() {
    // 每天凌晨0点执行一次:0 0 0 * * ?
    // 每隔3秒执行一次:*/3 * * * * *
    // spec := "*/3 * * * * *"

    spec := "* * * * *"
    c := cron.New(cron.WithSeconds())
    c.AddFunc(spec, func() {
        fmt.Println("execute")
    })
    go c.Start()
    defer c.Stop()
    select {}
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Jenkins定时构建cron语法
文章目录Jenkins定时构建cron语法Jenkins定时构建cron语法Jenkins定时构建采用cron语法。常见例子:\每1分钟\/1\\\\\每5分钟H/5\\\\\每30分钟H/30\\\\\每1小时H\/1
Stella981 Stella981
3年前
Linux服务器时间同步命令
时间同步1.首先需了解linux内一任务计划工具crontabcrontab可以定时去执行你要做的动作直接用crontab命令编辑crontabu//设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数crontabl//列出某个用户cron服务的详细内容crontabr//删除某个用户的cron服务cr
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
Linux的定时任务
任务计划的条件:1.在未来的某个时间点执行一次某个任务(atbatch)2.周期性的执行某个任务(cron)at在指定时间执行任务_用法_at\选项参数\\时间\_选项参数_\l      查看作业\c      显示即将执行任务的细节\d      使用任务id号
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这