メインコンテンツまでスキップ

スケジュールタスク

本章ではスケジュールタスクの使用方法について説明します。

はじめに

スケジュールタスクコンポーネントは大きく2つのタイプに分かれます。1つは時間間隔で実行されるタイプです。このタイプのタスクは標準ライブラリのtime.Tickerを使用して実装されています。もう1つのタイプは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毎秒実行
EveryFiveSeconds5秒ごとに実行
EveryTenSeconds10秒ごとに実行
EveryFifteenSeconds15秒ごとに実行
EveryTwentySeconds20秒ごとに実行
EveryThirtySeconds30秒ごとに実行
EveryMinute毎分実行
EveryFiveMinutes5分ごとに実行
EveryTenMinutes10分ごとに実行
EveryFifteenMinutes15分ごとに実行
EveryTwentyMinutes20分ごとに実行
EveryThirtyMinutes30分ごとに実行
Hourly毎時実行
EveryFiveHours5時間ごとに実行
EveryTenHours10時間ごとに実行
EveryTwentyHours20時間ごとに実行
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秒に実行
EveryFiveMinute5分ごとの0秒に実行
EveryTenMinute10分ごとの0秒に実行
EveryFifteenMinute15分ごとの0秒に実行
EveryTwentyMinute20分ごとの0秒に実行
EveryThirtyMinute30分ごとの0秒に実行
EveryFortyFiveMinute45分ごとの0秒に実行
FirstDayOfMonth毎月1日の0時0分に実行
LastDayOfMonth毎月末日の0時0分に実行
FirstDayOfWeek毎週月曜日の0時0分に実行
LastDayOfWeek毎週日曜日の0時0分に実行
TenClockAtWeekday平日(月曜〜金曜)の午前10時0分に実行
TenClockAtWeekend週末(土曜・日曜)の午前10時0分に実行
HourlyBetween9And17ClockAtWeekday平日(月曜〜金曜)の午前9時から午後5時まで1時間ごとに実行
HalfHourlyBetween9And17ClockAtWeekday平日(月曜〜金曜)の午前9時から午後5時まで30分ごとに実行