Golang 定时任务cron

39 阅读1分钟

集成 robfig/cron/v3 库,实现一个定时调度器,为项目提供灵活可控的定时任务能力。

安装

安装cron最新第三方库,和老版本的最大区别在于如果需要秒级定义,需要额外传入参数,并且可以自由配置参数

go get -u github.com/robfig/cron/v3

验证网站:crontab.guru/#0_4_8-14_5…

# 文件格式說明
# ┌──分鐘(0 - 59)
# │  ┌──小時(0 - 23)
# │  │  ┌──日(1 - 31)
# │  │  │  ┌─月(1 - 12)
# │  │  │  │  ┌─星期(0 - 6,表示从周日到周六)
# │  │  │  │  │
# *  *  *  *  * 被執行的命令

基础示例

package main

import (
   "fmt"
   "github.com/robfig/cron/v3"
   "time"
)

func TestCron() {
   c := cron.New()
   i := 1
   EntryID, err := c.AddFunc("*/1 * * * *", func() {
      fmt.Println(time.Now(), "每分钟执行一次", i)
      i++
   })
   fmt.Println(time.Now(), EntryID, err)

   c.Start() // 启动任务
   time.Sleep(time.Minute * 5)

  //  c.Stop() // 终止任务
}
func main() {
   TestCron()
}

常用部分

  • 秒级操作

cron.WithSeconds()

  • 函数没执行完就跳过本次函数

cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger))

  • 打印任务日志

cron.WithLogger(cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags)))

package main

import (
   "fmt"
   "github.com/robfig/cron/v3"
   "log"
   "os"
   "time"
)

func TestCron() {
   c := cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger)), cron.WithLogger(
      cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))))
   i := 1
   EntryID, err := c.AddFunc("*/5 * * * * *", func() {
      fmt.Println(time.Now(), "每5s一次----------------", i)
      time.Sleep(time.Second *6)
      i++
   })
   fmt.Println(time.Now(), EntryID, err)

   c.Start()
   time.Sleep(time.Second * 30)
}
func main() {
   TestCron()
}

启动多个任务AddJob

package main

import (
   "fmt"
   "github.com/robfig/cron/v3"
   "time"
)

type Job1 struct {
}

func (t Job1) Run() {
   fmt.Println(time.Now(), "I'm Job1")
}

type Job2 struct {
}

func (t Job2) Run() {
   fmt.Println(time.Now(), "I'm Job2")
}

func TestCron() {
   c := cron.New(cron.WithSeconds())

   EntryID, err := c.AddJob("*/5 * * * * *", Job1{})
   fmt.Println(time.Now(), EntryID, err)

   EntryID, err = c.AddJob("*/10 * * * * *", Job2{})
   fmt.Println(time.Now(), EntryID, err)

   c.Start()
   time.Sleep(time.Second * 30)
}
func main() {
   TestCron()
}

使用@every

每10s执行一次

package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
    "time"
)

func TestCron() {
    c := cron.New()
    c.AddFunc("@every 10s", func() {
       fmt.Println("Every 10 Seconds")
    })
    c.Start()

    time.Sleep(time.Minute * 5)
}
func main() {
    TestCron()
}

设置时区

package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
    "time"
)

func TestCron() {
    //c := cron.New()
    // 上海时区早六点
    nyc, _ := time.LoadLocation("Asia/Shanghai")
    c := cron.New(cron.WithLocation(nyc))
    c.AddFunc("@every 10s", func() {
       fmt.Println(12)
    })
    c.Start()

    time.Sleep(time.Minute * 5)
}
func main() {
    TestCron()
}