跳到主要内容

计划任务

本章节将介绍计划任务如何使用。

简介

计划任务组件大致分为两类。一种是按照时间间隔执行。此类任务是使用标准库time.Ticker实现的。另一种类型是使用Linux Crontab表达式执行的。该类底层封装了robfig/cron类库。计划任务为开发者提供了简单易用的语法糖。

使用方法

间隔性的

main.go
import (
"github.com/keepchen/go-sail/v3/schedule"
)

func main() {
ch := make(chan, struct{})
task := func() {
fmt.Println("taskName...")
}
schedule.NewJob("taskName", task).EverySecond()
<-ch //waiting...
}

下面列出常用的语法糖

语法糖描述
Every每隔多久执行一次
EverySecond每秒执行一次
EveryFiveSeconds每5秒执行一次
EveryTenSeconds每10秒执行一次
EveryFifteenSeconds每15秒执行一次
EveryTwentySeconds每20秒执行一次
EveryThirtySeconds每30秒执行一次
EveryMinute每分钟执行一次
EveryFiveMinutes每5分钟执行一次
EveryTenMinutes每10分钟执行一次
EveryFifteenMinutes每15分钟执行一次
EveryTwentyMinutes每20分钟执行一次
EveryThirtyMinutes每30分钟执行一次
Hourly每1小时执行一次
EveryFiveHours每5小时执行一次
EveryTenHours每10小时执行一次
EveryTwentyHours每20小时执行一次
Daily每天执行一次(每24小时)
Weekly每周执行一次(每7天)
Monthly每月执行一次(每30天)
Yearly每年执行一次(每365天)

Linux Crontab风格的

main.go
import (
"github.com/keepchen/go-sail/v3/schedule"
)

func main() {
ch := make(chan, struct{})
task := func() {
fmt.Println("taskName...")
}
schedule.NewJob("taskName", task).RunAt("* * * * *")
<-ch //waiting...
}

延迟性的 (一次性的)

main.go
import (
"time"
"github.com/keepchen/go-sail/v3/schedule"
)

func main() {
ch := make(chan, struct{})
task := func() {
fmt.Println("taskName...")
}
schedule.NewJob("taskName", task).RunAfter(5*time.Second)
<-ch //waiting...
}

防止任务堆叠

WithoutOverlapping()方法的作用是防止任务同时重复运行。当你的服务运行多个副本并且你希望确保任务的唯一性时,它非常有用。

注意

该功能需要提前初始化Redis连接实例,无论是单机模式还是集群模式。 否则它会panic

main.go
import (
"github.com/keepchen/go-sail/v3/schedule"
)

func main() {
ch := make(chan, struct{})
task := func() {
fmt.Println("taskName...")
}
schedule.NewJob("taskName", task).WithoutOverlapping().EverySecond()
<-ch //waiting...
}
备注

需要注意的是,你的任务不应该完全是一个goroutine,否则会出现意想不到的情况,并且WithoutOverlapping()也会失败。

这里给出了一个错误的示范:

main.go
import (
"github.com/keepchen/go-sail/v3/schedule"
)

func main() {
ch := make(chan, struct{})
task := func() {
go func() {
...
fmt.Println("taskName...")
...
}
}
schedule.NewJob("taskName", task).WithoutOverlapping().EverySecond()
<-ch //waiting...
}

取消

尚未启动或未运行的任务将被直接取消。 正在运行的任务将等待其运行完成,然后不再启动。

main.go
import (
"time"
"github.com/keepchen/go-sail/v3/schedule"
)

func main() {
ch := make(chan, struct{})
task := func() {
fmt.Println("taskName...")
}
cancel := schedule.NewJob("taskName", task).WithoutOverlapping().EverySecond()
time.Sleep(5*time.Second)
cancel()
<-ch //waiting...
}

Crontab表达式

使用方法

main.go
import (
"github.com/keepchen/go-sail/v3/schedule"
)

func main() {
ch := make(chan, struct{})
task := func() {
fmt.Println("taskName...")
}
schedule.NewJob("taskName", task).WithoutOverlapping().RunAt(schedule.EveryFiveMinute)
<-ch //waiting...
}

下面列出内置的表达式常量

常量描述
EveryMinute每分钟的开始第0秒
EveryFiveMinute每5分钟的开始第0秒
EveryTenMinute每10分钟的开始第0秒
EveryFifteenMinute每15分钟的开始第0秒
EveryTwentyMinute每20分钟的开始第0秒
EveryThirtyMinute每30分钟的开始第0秒
EveryFortyFiveMinute每45分钟的开始第0秒
FirstDayOfMonth每月的第一天的0点0分
LastDayOfMonth每月的最后一天的0点0分
FirstDayOfWeek每周的第一天(周一)的0点0分
LastDayOfWeek每周的最后一天(周天)的0点0分
TenClockAtWeekday每个工作日(周一~周五)的上午10点0分
TenClockAtWeekend每个周末(周六和周日)的上午10点0分
HourlyBetween9And17ClockAtWeekday每个工作日(周一~周五)的上午9点0分到下午5点0分每小时一次
HalfHourlyBetween9And17ClockAtWeekday每个工作日(周一~周五)的上午9点0分到下午5点0分每半时一次