Golang にて Cron を Go だけで完結させる

Crontab だと管理しにくいので、
Cron 処理をプロジェクト内だけで完結させる。

Github に色々あった中で、
今回は robfig/cron を使用する。

サンプルコード

go.mod

module github.com/psychedelicnekopunch/go-sample

go 1.14

require (
	github.com/robfig/cron/v3 v3.0.1
)

cron.go

package main

import (
	"fmt"
	"net/http"

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

func main() {

	// Cron と API を想定したルーティングを一緒に書く

	// Cron
	// サンプルでは n 秒毎で実装しているけど、
	// 実際に crontab で使用する "30 2 * * *" のような記述もできる。
	c := cron.New()
	
	// 例その1
	// 2秒毎に呼び出す
	c.AddFunc("@every 2s", func() {
		call()
	})
	
	// 例その2
	// 3秒毎に呼び出す
	c.AddFunc("@every 3s", call2)
	
	c.Start()

	// API を想定したルーティング
	http.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) {})

	// ここではポート番号 8080 で起動。適当に番号を当てていい
	if err := http.ListenAndServe(":8080", nil); err != nil {
		fmt.Printf(err.Error())
	}
}

func call() {
	fmt.Printf("call\n")
}

func call2() {
	fmt.Printf("call2\n")
}

起動

ctl + c で終了。

$ go run cron.go

call
call2
call
call2
call
call
call2
call