golang简单易用的crontab风格任务调度插件cheek的使用
Golang简单易用的Crontab风格任务调度插件cheek的使用
cheek
是一个微型声明式作业调度器,专为单节点环境设计。它旨在轻量级、独立且简单,不追求鲁棒性。
快速开始
获取最新版本:
curl -L https://github.com/bart6114/cheek/releases/latest/download/cheek-darwin-amd64 -o cheek
chmod +x cheek
./cheek run schedule.yaml
完整示例Demo
下面是一个使用cheek的完整示例,包含一个YAML配置文件和一个简单的Go程序:
1. 创建schedule.yaml配置文件
# schedule.yaml
jobs:
hello_world:
schedule: "* * * * *" # 每分钟运行一次
command: echo "Hello World"
timezone: UTC
retries: 3
retry_delay: 5s
2. 使用Go程序集成cheek
package main
import (
"log"
"os"
"os/signal"
"syscall"
"github.com/bart6114/cheek"
)
func main() {
// 创建新的调度器实例
scheduler := cheek.NewScheduler()
// 从YAML文件加载任务
if err := scheduler.LoadFromYaml("schedule.yaml"); err != nil {
log.Fatalf("Failed to load schedule: %v", err)
}
// 启动调度器
go scheduler.Start()
// 设置信号处理,优雅关闭
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
<-sigChan
// 停止调度器
scheduler.Stop()
log.Println("Scheduler stopped gracefully")
}
3. 直接使用代码定义任务
package main
import (
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/bart6114/cheek"
)
func main() {
scheduler := cheek.NewScheduler()
// 添加一个简单的任务
scheduler.AddJob(cheek.Job{
Name: "print_time",
Schedule: "*/5 * * * * *", // 每5秒运行一次
Command: "date",
Timezone: "Local",
})
// 添加一个带回调的任务
scheduler.AddJob(cheek.Job{
Name: "complex_task",
Schedule: "0 * * * *", // 每小时运行一次
Command: "/path/to/your/script.sh",
OnSuccess: func(j *cheek.Job) {
log.Printf("Job %s succeeded at %v", j.Name, time.Now())
},
OnFailure: func(j *cheek.Job) {
log.Printf("Job %s failed at %v", j.Name, time.Now())
},
})
go scheduler.Start()
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
<-sigChan
scheduler.Stop()
}
功能特点
- Crontab风格调度:支持标准的cron表达式
- 简单易用:通过YAML文件或代码直接配置
- 轻量级:专为单节点设计,资源占用低
- 重试机制:支持任务失败后自动重试
- 时区支持:可以为每个任务单独设置时区
注意事项
- cheek设计用于单节点环境,不适合分布式场景
- 对于需要高可用性或分布式调度的场景,建议考虑其他解决方案
- 可以通过日志或回调函数监控任务执行情况
cheek是构建在许多优秀开源项目之上的,特别感谢gronx项目提供的CRON字符串解析功能。
更多关于golang简单易用的crontab风格任务调度插件cheek的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang简单易用的crontab风格任务调度插件cheek的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 简单易用的 Crontab 风格任务调度插件 Cheek 使用指南
Cheek 是一个轻量级的 Golang 任务调度库,提供了类似 Crontab 的语法来安排周期性任务。它简单易用,适合需要基本任务调度功能的 Go 应用程序。
安装 Cheek
首先安装 Cheek 库:
go get github.com/cheekybits/genny
go get github.com/cheekybits/cheek
基本使用方法
1. 创建调度器实例
package main
import (
"fmt"
"time"
"github.com/cheekybits/cheek"
)
func main() {
// 创建新的调度器实例
scheduler := cheek.New()
// 确保在程序退出前停止所有任务
defer scheduler.Stop()
}
2. 添加定时任务
Cheek 支持标准的 crontab 表达式格式:
// 每分钟执行一次
err := scheduler.Add("* * * * *", func() {
fmt.Println("每分钟执行的任务", time.Now())
})
if err != nil {
fmt.Println("添加任务失败:", err)
}
// 每5分钟执行一次
err = scheduler.Add("*/5 * * * *", func() {
fmt.Println("每5分钟执行的任务", time.Now())
})
3. 启动调度器
// 启动调度器
go scheduler.Start()
// 主程序保持运行
select {}
完整示例
下面是一个完整的 Cheek 使用示例:
package main
import (
"fmt"
"time"
"github.com/cheekybits/cheek"
)
func main() {
// 创建调度器
scheduler := cheek.New()
defer scheduler.Stop()
// 添加任务
// 每分钟执行
scheduler.Add("* * * * *", func() {
fmt.Println("每分钟任务执行:", time.Now().Format("2006-01-02 15:04:05"))
})
// 每小时的第30分钟执行
scheduler.Add("30 * * * *", func() {
fmt.Println("每小时30分任务执行:", time.Now().Format("2006-01-02 15:04:05"))
})
// 每天凌晨1点执行
scheduler.Add("0 1 * * *", func() {
fmt.Println("每天凌晨1点任务执行:", time.Now().Format("2006-01-02 15:04:05"))
})
// 启动调度器
go scheduler.Start()
fmt.Println("任务调度器已启动,按Ctrl+C退出...")
// 保持程序运行
select {}
}
Cheek 的 Crontab 表达式格式
Cheek 支持标准的 crontab 表达式格式:
* * * * *
- - - - -
| | | | |
| | | | +----- 星期几 (0 - 6) (星期天=0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 日期 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
特殊符号:
*
表示所有可能的值,
表示多个值,如1,3,5
-
表示范围,如1-5
/
表示步长,如*/2
表示每2个单位
高级功能
1. 带参数的任务
scheduler.Add("* * * * *", func() {
myTask("参数1", 123)
})
func myTask(arg1 string, arg2 int) {
fmt.Printf("执行带参数的任务: %s, %d\n", arg1, arg2)
}
2. 动态添加和移除任务
// 添加任务并保存ID
taskID, err := scheduler.Add("* * * * *", func() {
fmt.Println("可移除的任务")
})
// 移除任务
scheduler.Remove(taskID)
3. 错误处理
// 添加无效的cron表达式
err := scheduler.Add("invalid * * * *", func() {})
if err != nil {
fmt.Println("添加任务错误:", err)
}
注意事项
- Cheek 是一个轻量级调度器,不适合高精度任务(毫秒级)
- 长时间运行的任务可能会影响后续任务的准时执行
- 在生产环境中应考虑添加恢复机制,防止任务panic导致程序崩溃
替代方案
如果 Cheek 不能满足需求,也可以考虑以下 Go 任务调度库:
- github.com/robfig/cron - 更成熟的 cron 库
- github.com/jasonlvhit/gocron - 更简单的 API
- github.com/rakanalh/scheduler - 支持一次性任务
Cheek 以其简洁性著称,特别适合小型项目或需要快速集成基本调度功能的场景。