1. 程式人生 > 實用技巧 >Go 的定時任務模組 Cron 使用

Go 的定時任務模組 Cron 使用

前言

新專案是Golang作為開發語言, 遇到了些新的坑, 也學到了新的知識, 收穫頗豐

本章介紹在Go中使用Cron定時任務模組來實現邏輯

正文

在專案中, 我們往往需要定時執行一些邏輯, 舉個例子, 財務系統每月需要自動的總結報表發生到指定郵箱, 生成餅圖儲存等邏輯, 作為服務方, 我們必須維護一個定時任務系統來做到定時觸發任務執行

下面介紹Go專案中很出名的定時任務模組, Cron 他的star目前有7.2k(截止到本章發出)

下面我們來了解如何使用, 以Demo為例

package task

import (
	"fmt"
	"remoteAdmin/tools"

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

var myCron *cron.Cron

// InitAndStart init cron task
func InitAndStart() {
	myCron = cron.New()
	defer myCron.Stop().Done()
	// c.AddFunc
	// https://en.wikipedia.org/wiki/Cron
	userOfflineDetectionTaskID, err := myCron.AddFunc(fmt.Sprintf("%v * * * *", tools.EnvConfig.Cron.UserOffineRestartMinutes), userOfflineDetection)
	if err != nil {
		tools.Log.Panic("Cron AddFuncPanic", zap.Error(err))
	}
	tools.Log.Info(fmt.Sprintf("Successfully Add userOfflineDetection To Cron, ID: %v", userOfflineDetectionTaskID))
	// start
	myCron.Start()
}


// userOfflineDetection User offline detection
func userOfflineDetection() {
  fmt.Println("DEMO")
}

這裡我是講其作為一個模組來使用, 因為在實際使用中需要執行的定時任務不止一個, 而且程式碼邏輯可能比較長, 所以我將 cron 物件單獨 var 出來供其他函式使用

程式碼的入口在 InitAndStart 函式, 在一切的開始, 我們需要先 New 出 *cron.Cron 暫存器才可以, 使用 cron.New() 生成一個任務的暫存器物件

我們希望在主程式執行結束時能主動的將暫存器停止, 所以在 New 完後立刻使用 defer 註冊關閉邏輯 .Stop().Done() 是通知下游要關閉暫存器了, 等待下游手上的任務全部處理完畢即結束

隨後就是註冊任務了, 使用 AddFunc函式來註冊任務, 他接受兩個引數, 引數一指定了該函式什麼時候去觸發執行, 引數二就是其要執行的函數了

關於引數一, 採用的是和unix的任務定時任務一樣的格式, 比如我寫的代表每1分鐘執行一次, 具體的規則可檢視 wiki (需FQ)

此處我註冊的30秒執行一次 userOfflineDetection 函式

同時 cron 可同時註冊很多個定時任務, 只需使用 AddFunc 註冊即可

myCron.Start() 則啟動暫存器, 如果這個Goroutine中已經啟動了 Cron, 則不進行任何操作

需要注意的是, 在暫存器啟動後你仍然可以使用 AddFunc 來註冊新的定時任務, 也是可以正常的註冊的, 例如

myCron.Start()
myCron.AddFunc("* 1 * * *", userOfflineDetection)

如果你想要對每一個註冊過的定時任務進行控制, 還記得AddFunc返回的結果嗎, 其引數1是這個任務的ID, 引數二為可能的err錯誤

以上為 Cron 的基本用法, 希望對你有所幫助