基本使用

  1. package main
  2. import (
  3. "context"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/os/gcron"
  6. "github.com/gogf/gf/v2/os/gctx"
  7. "time"
  8. )
  9. func main() {
  10. var (
  11. err error
  12. ctx = gctx.New()
  13. )
  14. _, err = gcron.Add(ctx, "* * * * * *", func(ctx context.Context) {
  15. g.Log().Print(ctx, "Every second")
  16. }, "MySecondCronJob")
  17. if err != nil {
  18. panic(err)
  19. }
  20. _, err = gcron.Add(ctx, "0 30 * * * *", func(ctx context.Context) {
  21. g.Log().Print(ctx, "Every hour on the half hour")
  22. })
  23. if err != nil {
  24. panic(err)
  25. }
  26. _, err = gcron.Add(ctx, "@hourly", func(ctx context.Context) {
  27. g.Log().Print(ctx, "Every hour")
  28. })
  29. if err != nil {
  30. panic(err)
  31. }
  32. _, err = gcron.Add(ctx, "@every 1h30m", func(ctx context.Context) {
  33. g.Log().Print(ctx, "Every hour thirty")
  34. })
  35. if err != nil {
  36. panic(err)
  37. }
  38. g.Dump(gcron.Entries())
  39. time.Sleep(3 * time.Second)
  40. g.Log().Print(ctx, `stop cronjob "MySecondCronJob"`)
  41. gcron.Stop("MySecondCronJob")
  42. time.Sleep(3 * time.Second)
  43. g.Log().Print(ctx, `start cronjob "MySecondCronJob"`)
  44. gcron.Start("MySecondCronJob")
  45. time.Sleep(3 * time.Second)
  46. }

执行后,输出结果为:

  1. [
  2. {
  3. Name: "MySecondCronJob",
  4. Job: 0x14077e0,
  5. Time: "2021-11-14 12:13:53.445132 +0800 CST m=+0.006167069",
  6. },
  7. {
  8. Name: "cron-1",
  9. Job: 0x14078a0,
  10. Time: "2021-11-14 12:13:53.44515 +0800 CST m=+0.006185688",
  11. },
  12. {
  13. Name: "cron-2",
  14. Job: 0x1407960,
  15. Time: "2021-11-14 12:13:53.445161 +0800 CST m=+0.006196483",
  16. },
  17. {
  18. Name: "cron-3",
  19. Job: 0x1407a20,
  20. Time: "2021-11-14 12:13:53.445218 +0800 CST m=+0.006252937",
  21. },
  22. ]
  23. 2021-11-14 12:13:54.442 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
  24. 2021-11-14 12:13:55.441 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
  25. 2021-11-14 12:13:56.440 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
  26. 2021-11-14 12:13:56.445 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} stop cronjob "MySecondCronJob"
  27. 2021-11-14 12:13:59.445 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} start cronjob "MySecondCronJob"
  28. 2021-11-14 12:14:00.443 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
  29. 2021-11-14 12:14:01.442 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second
  30. 2021-11-14 12:14:02.443 {189cwi9ngk0cfp7l8gcwciw100sr9cuu} Every second

单例定时任务

单例定时任务,即同时只能有一个该任务正在运行。当第二个相同的定时任务触发执行时,如果发现已有该任务正在执行,第二个任务将会退出不执行,定时器将会继续等待下一次定时任务的触发检测,以此类推。可以使用AddSingleton添加单例定时任务。

  1. package main
  2. import (
  3. "context"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/os/gcron"
  6. "github.com/gogf/gf/v2/os/gctx"
  7. "time"
  8. )
  9. func main() {
  10. var (
  11. err error
  12. ctx = gctx.New()
  13. )
  14. _, err = gcron.AddSingleton(ctx, "* * * * * *", func(ctx context.Context) {
  15. g.Log().Print(ctx, "doing")
  16. time.Sleep(2 * time.Second)
  17. })
  18. if err != nil {
  19. panic(err)
  20. }
  21. select {}
  22. }

执行后,输出结果为:

  1. 2021-11-14 12:16:54.073 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
  2. 2021-11-14 12:16:57.072 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
  3. 2021-11-14 12:17:00.072 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
  4. 2021-11-14 12:17:03.071 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
  5. 2021-11-14 12:17:06.072 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
  6. 2021-11-14 12:17:09.072 {189cwi9nmm0cfp7niz319fc100zrw0ig} doing
  7. ...

单次定时任务

单次定时任务,AddOnce方法用于添加只运行一次的定时任务,当运行一次数后该定时任务自动销毁,Size方法可以查看运行状态,相关方法:

  1. func main() {
  2. var (
  3. ctx = gctx.New()
  4. )
  5. cron := gcron.New()
  6. array := garray.New(true)
  7. cron.AddOnce(ctx, "@every 2s", func(ctx context.Context) {
  8. array.Append(1)
  9. })
  10. fmt.Println(cron.Size(),array.Len())
  11. time.Sleep(3000 * time.Millisecond)
  12. fmt.Println(cron.Size(),array.Len())
  13. }

执行后,输出结果为:

  1. 1 0
  2. 0 1

指定次数的定时任务

指定次数的定时任务,AddTimes方法用于添加运行指定次数的定时任务,当运行times次数后该定时任务自动销毁,Size方法可以查看运行状态,相关方法:

  1. func main() {
  2. var (
  3. ctx = gctx.New()
  4. )
  5. cron := gcron.New()
  6. array := garray.New(true)
  7. cron.AddTimes(ctx, "@every 2s", 2,func(ctx context.Context) {
  8. array.Append(1)
  9. })
  10. fmt.Println(cron.Size(), array.Len())
  11. time.Sleep(3000 * time.Millisecond)
  12. fmt.Println(cron.Size(), array.Len())
  13. time.Sleep(3000 * time.Millisecond)
  14. fmt.Println(cron.Size(), array.Len())
  15. }

执行后,输出结果为:

  1. 1 0
  2. 1 1
  3. 0 2

获取所有注册的定时任务信息

获取所有注册的定时任务信息,Entries方法用于获取当前所有已注册的定时任务信息,以切片的形式返回(按注册时间asc排序),相关方法:

  1. func main() {
  2. var (
  3. ctx = gctx.New()
  4. )
  5. cron := gcron.New()
  6. array := garray.New(true)
  7. cron.AddTimes(ctx, "@every 1s", 2,func(ctx context.Context) {
  8. array.Append(1)
  9. },"cron1")
  10. cron.AddOnce(ctx, "@every 1s",func(ctx context.Context) {
  11. array.Append(1)
  12. },"cron2")
  13. entries := cron.Entries()
  14. for k, v := range entries{
  15. fmt.Println(k,v.Name,v.Time)
  16. }
  17. time.Sleep(3000 * time.Millisecond)
  18. fmt.Println(array.Len())
  19. }

执行后,输出结果为:

  1. 0 cron2 2022-02-09 10:11:47.2421345 +0800 CST m=+0.159116501
  2. 1 cron1 2022-02-09 10:11:47.2421345 +0800 CST m=+0.159116501
  3. 3

任务搜索

Search搜索返回具有指定“名称”的计划任务。(返回定时任务*Entry对象指针),如果找不到,则返回nil。相关方法:

  1. func main() {
  2. var (
  3. ctx = gctx.New()
  4. )
  5. cron := gcron.New()
  6. array := garray.New(true)
  7. cron.AddTimes(ctx, "@every 1s", 2,func(ctx context.Context) {
  8. array.Append(1)
  9. },"cron1")
  10. cron.AddOnce(ctx, "@every 1s",func(ctx context.Context) {
  11. array.Append(1)
  12. },"cron2")
  13. search := cron.Search("cron2")
  14. g.Log().Print(ctx, search)
  15. time.Sleep(3000 * time.Millisecond)
  16. fmt.Println(array.Len())
  17. // Output:
  18. // 3
  19. }

执行后,输出结果为:

  1. 2022-02-09 10:52:30.011 {18a909957cfed11680c1b145da1ef096} {"Name":"cron2","Time":"2022-02-09T10:52:29.9972842+08:00"}

任务停止

Stop方法用于停止定时任务(Stop会停止但不会删除), 可通过name参数指定需要停止的任务名称,如果没有指定name,它将停止整个cron。相关方法:

  1. func main() {
  2. var (
  3. ctx = gctx.New()
  4. )
  5. cron := gcron.New()
  6. array := garray.New(true)
  7. cron.AddTimes(ctx, "@every 2s", 1,func(ctx context.Context) {
  8. array.Append(1)
  9. },"cron1")
  10. cron.AddOnce(ctx, "@every 2s",func(ctx context.Context) {
  11. array.Append(1)
  12. },"cron2")
  13. fmt.Println(array.Len(),cron.Size())
  14. cron.Stop("cron2")
  15. fmt.Println(array.Len(),cron.Size())
  16. time.Sleep(3000 * time.Millisecond)
  17. fmt.Println(array.Len(),cron.Size())
  18. // Output:
  19. // 1
  20. // 1
  21. }

执行后,输出结果为:

  1. 0 2
  2. 0 2
  3. 1 1

任务停止并删除

Remove方法用于根据名称name删除定时任务(停止并删除);相关方法:

  1. func main() {
  2. var (
  3. ctx = gctx.New()
  4. )
  5. cron := gcron.New()
  6. array := garray.New(true)
  7. cron.AddTimes(ctx, "@every 2s", 1,func(ctx context.Context) {
  8. array.Append(1)
  9. },"cron1")
  10. cron.AddOnce(ctx, "@every 2s",func(ctx context.Context) {
  11. array.Append(1)
  12. },"cron2")
  13. fmt.Println(array.Len(),cron.Size())
  14. cron.Remove("cron2")
  15. fmt.Println(array.Len(),cron.Size())
  16. time.Sleep(3000 * time.Millisecond)
  17. fmt.Println(array.Len(),cron.Size())
  18. // Output:
  19. // 0 2
  20. // 0 1
  21. // 1 0
  22. }

执行后,输出结果为:

  1. 0 2
  2. 0 1
  3. 1 0

任务启动

Start方法用于启动定时任务(Add后自动启动定时任务), 可通过name参数指定需要启动的任务名称。如果没有指定name,它将启动整个cron。相关方法:

  1. func main() {
  2. var (
  3. ctx = gctx.New()
  4. )
  5. cron := gcron.New()
  6. array := garray.New(true)
  7. cron.AddOnce(ctx, "@every 2s",func(ctx context.Context) {
  8. array.Append(1)
  9. },"cron2")
  10. cron.Stop("cron2")
  11. time.Sleep(3000 * time.Millisecond)
  12. fmt.Println(array.Len(),cron.Size())
  13. cron.Start("cron2")
  14. time.Sleep(3000 * time.Millisecond)
  15. fmt.Println(array.Len(),cron.Size())
  16. // Output:
  17. // 0 1
  18. // 1 0
  19. }

执行后,输出结果为:

  1. 0 1
  2. 1 0

日志记录功能

gcron支持日志记录功能,并可设置日志输出的文件以及级别。默认情况下仅会输出LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT错误级别的日志(包括定时任务运行异常日志),运行日志以LEVEL_DEBUG的级别进行记录,因此默认不会记录。 gcron使用了goframe框架统一的日志组件,因此可以复用日志组件的所有特性。相关方法:

  1. func SetLogger(logger *glog.Logger)
  2. func GetLogger() *glog.Logger

日志组件特性请参考 日志组件 章节。

使用示例:

  1. package main
  2. import (
  3. "context"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/os/gcron"
  6. "github.com/gogf/gf/v2/os/gctx"
  7. "github.com/gogf/gf/v2/os/glog"
  8. "time"
  9. )
  10. func main() {
  11. var (
  12. err error
  13. ctx = gctx.New()
  14. logger = glog.New()
  15. )
  16. logger.SetLevel(glog.LEVEL_ALL)
  17. gcron.SetLogger(logger)
  18. _, err = gcron.Add(ctx, "* * * * * ?", func(ctx context.Context) {
  19. g.Log().Info(ctx, "test")
  20. })
  21. if err != nil {
  22. panic(err)
  23. }
  24. time.Sleep(3 * time.Second)
  25. }

执行后,终端输出结果为:

定时任务-基本使用 - 图1