基于Go的Cron Job实现
Posted by 付辉 on Monday, March 25, 2019 共322字
随风要稳,逆风要浪
timer
The Timer type represents a single event. When the Timer expires, the current time will be sent on C.
下面使用timer
实现在固定时间点执行task
任务。
处理思路:每次在执行task
前,计算当前时间
和执行时间点
的差值,通过设置timer
未来的触发时间来执行任务。在完成本次task
之后,重置timer
的触发时间,等待下一次执行。
const IntervalPeriod time.Duration = 24 * time.Hour
// 核心函数:在h:m:s的时候执行task任务
func runningRoutine(hour, minute, second int, task func() error) {
ticket := time.NewTimer(GetNextTickDuration(hour, minute, second))
for {
<-ticket.C
if err := task(); err != nil {
}
ticket.Reset(GetNextTickDuration(hour, minute, second))
}
}
// 获取Task执行的时间
func GetNextTickDuration(hour, minute, second int) time.Duration {
nextTick := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(),
hour, minute, second, 0, time.Local)
if !nextTick.After(time.Now()) {
nextTick = nextTick.Add(IntervalPeriod)
}
return nextTick.Sub(time.Now())
}
ticker
ticker只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会触发。
func simulateCronByInterval(interval time.Duration, task func()) {
ticker := time.NewTicker(interval)
defer func() {
ticker.Stop()
}()
for {
<-ticker.C:
task()
}
}
参考文章: