1. はじめに

Golangのcronライブラリは、特定の時間や間隔でジョブをスケジュール実行するための強力で使いやすいツールです。これはUNIXのcronサービスをモデルにしており、Goアプリケーションに組み込むことができる独立したライブラリとして実装されています。cronライブラリは時間ベースのスケジューリングを担当し、実行するジョブに焦点を当てることができます。

2. 例

cronライブラリのインストール

プロジェクトでcronライブラリを使用するには、まずgo getコマンドを使用してインストールする必要があります:

go get github.com/robfig/cron/[email protected]

cronパッケージのインポート

インストール後、次のようにGoプログラムにインポートすることができます:

import "github.com/robfig/cron/v3"

以下は、1分ごとにメッセージを出力するCronジョブの設定例です:

package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
)

func main() {
    c := cron.New()
    c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") })
    c.AddFunc("@hourly", func() { fmt.Println("Every hour") })
    c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty") })
    c.Start()
    ..
    // Funcs are invoked in their own goroutine, asynchronously.
    ...
    // Funcs may also be added to a running Cron
    c.AddFunc("@daily", func() { fmt.Println("Every day") })
    ..
    ..
    c.Stop() // スケジューラを停止します(すでに実行中のジョブは停止しません)。
}

3. CRON式のフォーマット

Cron式は、6つのスペースで区切られたフィールドを使用して時刻のセットを表します。

フィールド名 必須? 許容値 許容される特殊文字
はい 0-59 * / , -
はい 0-59 * / , -
はい 0-23 * / , -
月の日 はい 1-31 * / , - ?
はい 1-12 または JAN-DEC * / , -
曜日 はい 0-6 または SUN-SAT * / , - ?

4. CRON式の特殊文字

  • アスタリスク ( * ) アスタリスクは、指定されたフィールドのすべての可能な値を示します。たとえば、分のフィールドでのアスタリスクは毎分を意味します。
  • スラッシュ ( / ) スラッシュ文字は増分を指定するために使用されます。たとえば、秒のフィールドでの "*/15" はゼロから始まる15秒ごとを意味します。
  • コンマ ( , ) コンマ文字は複数の離散値をリストするために使用されます。たとえば、曜日のフィールドでの "MON,WED,FRI" は月曜日、水曜日、金曜日にジョブが実行されることを意味します。
  • ハイフン ( - ) ハイフンは値の範囲を示します。時間のフィールドでの "9-17" は午前9時から午後5時までの毎時を意味します。
  • 疑問符 ( ? ) 疑問符は、月の日のフィールドや曜日のフィールドで使用され、特定の値を指定しないことを示します。

5. 事前定義スケジュール

利用可能な事前定義スケジュールの詳細な説明を、以下の表形式で表示します:

エントリー 説明 相当するもの
@yearly (または @annually) 1年に1回、1月1日深夜に実行 0 0 0 1 1 *
@monthly 1か月に1回、月初めの深夜に実行 0 0 0 1 * *
@weekly 1週間に1回、土/日の深夜に実行 0 0 0 * * 0
@daily (または @midnight) 1日に1回、深夜に実行 0 0 0 * * *
@hourly 1時間に1回、時間の始めに実行 0 0 * * * *

6. インターバルと固定インターバルスケジューリング

cronライブラリのもう一つの強力な機能は、固定間隔でのジョブのスケジューリングです。例えば、以下のように2時間ごとに実行されるジョブをスケジュールすることができます。

c.AddFunc("@every 2h", func() { fmt.Println("ジョブは2時間ごとに実行されます") })

7. タイムゾーンとジョブスケジューリング

Goアプリケーションが実行されているマシンのローカルタイムゾーンで解釈とスケジューリングが行われます。サマータイムの変更時には注意が必要であり、特定の時刻が存在しないか、繰り返されることがあります。

8. スレッドセーフおよび同期

cronライブラリはスレッドセーフで並行処理に対応しています。ユーザーはメソッド呼び出しの正しい順序付けを維持し、競合条件を避けるために注意することが重要です。必要に応じて適切な同期メカニズムを使用し、ジョブが正しくスケジュールされ、実行されることを確認する必要があります。