golang支持cron调度的定时任务执行插件库cronticker的使用

golang支持cron调度的定时任务执行插件库cronticker的使用

介绍

cronticker是一个支持Cron调度的Golang定时器库,可以按照Unix或Quartz格式的cron表达式来执行定时任务。

安装

go get github.com/krayzpipes/cronticker/cronticker

导入包:

import "github.com/krayzpipes/cronticker/cronticker"

使用示例

创建定时器

// 创建一个每周日纽约时间0点的定时器
ticker, err := cronticker.NewTicker("TZ=America/New_York 0 0 0 ? * SUN")
if err != nil {
    log.Fatal(err)
}
defer ticker.Stop() // 确保停止定时器释放资源

监听定时事件

// 等待下一次触发时间
tickerTime := <-ticker.C
fmt.Println("定时任务触发时间:", tickerTime)

重置定时器

// 重置为每周一、二、三0点触发
err = ticker.Reset("0 0 0 ? * MON,TUE,WED")
if err != nil {
    log.Fatal(err)
}

停止定时器

ticker.Stop()

Cron表达式格式

支持Unix和Quartz两种格式,还可以使用@daily等指令。可以在表达式前添加TZ=时区来指定时区,默认是UTC。

示例

Cron表达式 类型/格式 描述
“TZ=America/Los_Angeles 0 0 * * *” Unix 洛杉矶时间每天0点
“TZ=America/Los_Angeles 0 0 0 ? * MON” Quartz 洛杉矶时间每周一0点
“TZ=America/Los_Angeles @daily 指令 洛杉矶时间每天0点
@daily 指令 UTC时间每天0点

特殊字符

字符 描述 示例
- 范围 4-5
/ 步长 0/5
* 任意 */5
, 列表 1,4,5

完整示例

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/krayzpipes/cronticker/cronticker"
)

func main() {
	// 创建一个每天UTC时间0点触发的定时器
	ticker, err := cronticker.NewTicker("[@daily](/user/daily)")
	if err != nil {
		log.Fatal(err)
	}
	defer ticker.Stop() // 确保程序退出时停止定时器

	fmt.Println("等待每日定时任务...")
	
	// 监听定时器通道
	for tickTime := range ticker.C {
		fmt.Printf("定时任务触发时间: %v\n", tickTime)
		
		// 在这里执行你的定时任务逻辑
		doDailyTask()
	}
}

func doDailyTask() {
	fmt.Println("执行每日任务...")
	// 这里放置你的定时任务代码
}

这个示例展示了如何创建一个每天UTC时间0点触发的定时器,并在触发时执行任务。程序会一直运行,等待每天的定时触发。


更多关于golang支持cron调度的定时任务执行插件库cronticker的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang支持cron调度的定时任务执行插件库cronticker的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 定时任务执行插件库 cronticker 使用指南

cronticker 是一个轻量级的 Golang 定时任务调度库,它提供了类似 cron 表达式的定时任务执行功能。下面我将详细介绍如何使用这个库。

安装 cronticker

首先需要安装 cronticker 库:

go get github.com/robfig/cron/v3

基本使用方法

1. 创建定时任务

package main

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

func main() {
	// 创建一个新的cron实例
	c := cron.New()

	// 添加定时任务
	_, err := c.AddFunc("* * * * *", func() {
		fmt.Println("每分钟执行一次:", time.Now().Format("2006-01-02 15:04:05"))
	})
	if err != nil {
		fmt.Println("添加任务失败:", err)
		return
	}

	// 启动cron调度器
	c.Start()

	// 防止主程序退出
	select {}
}

2. cron 表达式格式

cronticker 使用标准的 cron 表达式格式:

* * * * *
| | | | |
| | | | +----- 星期几 (0 - 6) (星期天=0)
| | | +------- 月份 (1 - 12)
| | +--------- 日 (1 - 31)
| +----------- 小时 (0 - 23)
+------------- 分钟 (0 - 59)

3. 常用示例

package main

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

func main() {
	c := cron.New()

	// 每5分钟执行一次
	c.AddFunc("*/5 * * * *", func() {
		fmt.Println("每5分钟执行:", time.Now().Format("15:04:05"))
	})

	// 每天凌晨1点执行
	c.AddFunc("0 1 * * *", func() {
		fmt.Println("每天凌晨1点执行")
	})

	// 每周一上午9点执行
	c.AddFunc("0 9 * * 1", func() {
		fmt.Println("每周一上午9点执行")
	})

	// 每月1号凌晨0点执行
	c.AddFunc("0 0 1 * *", func() {
		fmt.Println("每月1号凌晨0点执行")
	})

	c.Start()
	select {}
}

高级功能

1. 设置时区

package main

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

func main() {
	// 使用中国时区
	location, _ := time.LoadLocation("Asia/Shanghai")
	c := cron.New(cron.WithLocation(location))

	c.AddFunc("0 9 * * *", func() {
		fmt.Println("北京时间每天9点执行:", time.Now().Format("15:04:05"))
	})

	c.Start()
	select {}
}

2. 任务日志

package main

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

func main() {
	c := cron.New(
		cron.WithLogger(
			cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags)),
		),
	)

	c.AddFunc("* * * * *", func() {
		fmt.Println("每分钟执行一次")
	})

	c.Start()
	select {}
}

3. 任务删除

package main

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

func main() {
	c := cron.New()

	// 添加任务并保存ID
	id, _ := c.AddFunc("* * * * *", func() {
		fmt.Println("每分钟执行一次")
	})

	// 10秒后删除任务
	time.AfterFunc(10*time.Second, func() {
		c.Remove(id)
		fmt.Println("任务已删除")
	})

	c.Start()
	select {}
}

注意事项

  1. cronticker 的最小时间粒度是分钟,不支持秒级任务
  2. 任务执行是同步的,长时间运行的任务会阻塞后续任务
  3. 对于需要并发执行的任务,需要在任务函数内部自行处理

替代方案

如果你需要更复杂的定时任务功能,也可以考虑以下替代方案:

  1. github.com/robfig/cron - 功能更全面的 cron 库
  2. github.com/jasonlvhit/gocron - 更简单的 API
  3. github.com/gorhill/cronexpr - 专注于 cron 表达式解析

希望这个指南能帮助你使用 cronticker 实现 Golang 中的定时任务调度!

回到顶部