基本介绍

gcron模块提供了对定时任务的实现,支持类似crontab的配置管理方式,并支持最小粒度到的定时任务管理。

使用方式

import "github.com/gogf/gf/v2/os/gcron"

接口文档

https://pkg.go.dev/github.com/gogf/gf/v2/os/gcron

简要说明:

  1. New方法用于创建自定义的定时任务管理对象。
  2. Add方法用于添加定时任务,其中:
    • - pattern 参数使用CRON语法格式(具体说明见本章后续相关说明)。
    • - job 参数为需要执行的任务方法(方法地址)。
    • - name 为非必需参数,用于给定时任务指定一个唯一的名称,注意如果已存在相同名称的任务,那么添加定时任务将会失败。
  3. AddSingleton方法用于添加单例定时任务,即同时只能有一个该任务正在运行(在内存中进行去重判断)。
  4. AddOnce方法用于添加只运行一次的定时任务,当运行一次数后该定时任务自动销毁。
  5. AddTimes方法用于添加运行指定次数的定时任务,当运行times次数后该定时任务自动销毁。
  6. Entries方法用于获取当前所有已注册的定时任务信息。
  7. Remove方法用于根据名称删除定时任务(停止并删除)。
  8. Search方法用于根据名称进行定时任务搜索(返回定时任务*Entry对象指针)。
  9. Start方法用于启动定时任务(Add后自动启动定时任务), 可通过name参数指定需要启动的任务名称。
  10. Stop方法用于停止定时任务(Remove会停止并删除), 可通过name参数指定需要停止的任务名称。
  11. Close方法用于关闭自定义的定时任务管理对象。

注意事项

  • 进程全局时区的影响:由于定时任务严格依赖时间计算,因此进程的全局时区对定时任务执行影响比较大。在添加定时任务时,请注意当前进程的全局时区设置,在没有设置全局时区时,默认使用的是系统时区。关于时区设置更多信息请参考:时间管理-时区设置

相关文档



Content Menu

  • No labels

20 Comments

  1. 文档非常清晰!

  2. 示例1为啥我运行跟文档写的不一样呢,哪里来的cmd,无法上传图片,我这边输出是"Name": "gcron-2",
            "Time": "2021-02-23T18:08:29.353741+08:00"没有其他字段了

  3. 如果支持毫秒就更完美了

    1. 实际业务中,有毫秒级别的使用场景吗?  求一个例子  谢谢

    1. AddOnce方法用于添加只运行一次的定时任务,当运行一次数后该定时任务自动销毁;请问这个里面加intervl是有什么用途?
    1. 没有这个参数。

  4. 在本地运行时正常的,但是放在docker容器里有报错

    https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wwf660e2b3e152fcff&corpsecret=sk_I1hACRBtmZbvRu0IRtjcjHHXPTD5UrSxB1KJmaeg
    2021-08-14 14:28:00.738 [ERRO] [gcron] getaccess(*/45 * * * * ?) gfast/app/task.Getaccess end with error: runtime error: invalid memory address or nil pointer dereference 
    Stack:
    1.  github.com/gogf/gf/os/gcron.(*Entry).check.func1
        /home/liu/go/pkg/mod/github.com/gogf/gf@v1.15.3/os/gcron/gcron_entry.go:138
    2.  gfast/app/task.Weixintoken
        /home/liu/gitcode/gfast-master/app/task/functions.go:103
    3.  gfast/app/task.Getaccess
        /home/liu/gitcode/gfast-master/app/task/functions.go:86
    4.  github.com/gogf/gf/os/gcron.(*Entry).check
        /home/liu/go/pkg/mod/github.com/gogf/gf@v1.15.3/os/gcron/gcron_entry.go:146
    5.  github.com/gogf/gf/os/gtimer.(*wheel).proceed.func1.1
        /home/liu/go/pkg/mod/github.com/gogf/gf@v1.15.3/os/gtimer/gtimer_loop.go:79

    1. 我找到问题了,因为时https 链接,需要ac根证书,容器默认时没有安装这个的。所以需要install ca-certificates  或者在构建基础镜像的时候 add上ac 特留言,避免大家踩坑。

  5. 希望可以添加一个延时任务的库

  6. 是否支持优雅停止所有的定时任务

  7. gcron.add(crontsr,func,name)    func如果带参数,怎么操作

    1. func() {
              var s = []int{}
              gcron.AddSingleton("@every 100s", func() {
                  service.Case(&s)
              })
       }()

      // 我是用这种方式实现的,不过感觉好像go语言不太推荐这样做

  8. 可以预览执行时间就好了,有的时候写的不知道对不对

      1. 我是想要在UI展示下次执行时间,给别人看的

    1. 我可终于自己解决了 😃

      package main
      
      import (
      	"fmt"
      	"time"
      	"github.com/robfig/cron"
      )
      
      func GetCronNextTime(cronStr string, t time.Time) (nextTime time.Time, err error) {
      	p := cron.NewParser(cron.Second | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
      	s, err := p.Parse(cronStr)
      	if err != nil {
      		return
      	}
      	nextTime = s.Next(t)
      	return
      }
      
      func main() {
      	t, err := GetCronNextTime("*/5 * * * * ?", time.Now())
      	fmt.Println("NextTime:", t, err)
      }
  9. 如何添加定时任务后,立即执行一次,并且受单例约束?

  10. 你好,我添加了一个定时任务,每分钟的第五秒执行一次,前面执行正常,运行一段时间之后出现了有时一分钟存了两条,或者按时间随机执行了这是为啥?
    如图下数据库中的日期:前面是第5秒,后面变成随机了

  11. 如果单例定时任务建议增加一个在缓存中判断唯一,这样可以在单体应用多个节点部署的时候保障只有一个任务执行

    1. 自己封装一个boot就可以了