golang简单易用的crontab风格任务调度插件cheek的使用

Golang简单易用的Crontab风格任务调度插件cheek的使用

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()
}

功能特点

  1. Crontab风格调度:支持标准的cron表达式
  2. 简单易用:通过YAML文件或代码直接配置
  3. 轻量级:专为单节点设计,资源占用低
  4. 重试机制:支持任务失败后自动重试
  5. 时区支持:可以为每个任务单独设置时区

注意事项

  • 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)
}

注意事项

  1. Cheek 是一个轻量级调度器,不适合高精度任务(毫秒级)
  2. 长时间运行的任务可能会影响后续任务的准时执行
  3. 在生产环境中应考虑添加恢复机制,防止任务panic导致程序崩溃

替代方案

如果 Cheek 不能满足需求,也可以考虑以下 Go 任务调度库:

Cheek 以其简洁性著称,特别适合小型项目或需要快速集成基本调度功能的场景。

回到顶部