# README
cronlib
cronlib
基于github.com/go-co-op/gocron
的基础上,添加了redis分布式锁,并简化了定时任务调度器的使用;
基于分布式锁的操作,用以解决在集群模式下,多cron可能在同一时刻发起调度的问题
cronlib 快速使用流程
- 初始化Job业务逻辑:定义Job定期执行具体业务逻辑
- 初始化Job任务:
NewJob()
方法创建调度job - 初始化Scheduler调度器
- 添加Job任务到调度器
- 调度器启动
简单的定时任务示例
func ExampleStartTest() {
var job1Fn = func(jobID int) {
log.Printf("exec job[#%d] fn", jobID)
}
// 准备job任务
job1 := NewJob("job1", func() { job1Fn(1) }, "* * * * *")
job2 := NewJob("job2", func() { job1Fn(2) }, "*/2 * * * *")
// 准备scheduler调度器
locker, err := NewRedisLocker("redis://127.0.0.1:6379")
if err != nil {
log.Fatalf("parse redis url got err: %s", err)
}
crond := NewScheduler(&Config{
Async: false, // 不阻塞主协程
SingletonModeAll: true, // 调度器不会重复调度同类型新的job任务
}, locker)
// 添加job任务
err = crond.AddJobs(job1, job2)
if err != nil {
log.Fatalf("crond add job got err: %s", err)
}
// job执行
crond.Start()
}
redis 依赖
通过docker快速启动一个本地redis实例:
$ docker-compose up -d
# Functions
NewJob 创建一个任务.
NewMockLocker creates a new mock instance.
NewRedisLocker 创建一个Redis分布式锁 Examples: redis://user:password@localhost:6789/3?dial_timeout=3&db=1&read_timeout=6s&max_retries=2 is equivalent to: &Options{ Network: "tcp", Addr: "localhost:6789", DB: 1, // path "/3" was overridden by "&db=1" DialTimeout: 3 * time.Second, // no time unit = seconds ReadTimeout: 6 * time.Second, MaxRetries: 2, }.
NewScheduler 初始化一个cron 调度器.
No description provided by the author
# Constants
cron格式`*/1 * * * *`,分(0-59) 时(0-23) 日(1-31) 月(1-12) 天(0-6).
cron格式`*/1 * * * *`,分(0-59) 时(0-23) 日(1-31) 月(1-12) 天(0-6).
cron格式`*/1 * * * *`,分(0-59) 时(0-23) 日(1-31) 月(1-12) 天(0-6).
凌晨1:00执行.
每小时整点执行.
cron格式`*/1 * * * *`,分(0-59) 时(0-23) 日(1-31) 月(1-12) 天(0-6).
每个月.
# Structs
Config Cron调度器配置.
Job 待执行的JOB任务.
MockLocker is a mock of Locker interface.
MockLockerMockRecorder is the mock recorder for MockLocker.
RedisLocker 基于Redis实现的分布式锁,.
Scheduler Cron调度程序.
# Interfaces
Locker 分布式锁接口 该接口主要是针对多个JOB执行时刻,进行并发控制,确保在不同机器上的Job仅执行一次行.