前言
新項目是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的任務定時任務一樣的格式, 比如我寫的代表每tools.EnvConfig.Cron.UserOffineRestartMinutes分鍾執行一次, 具體的規則可查看 wiki (需FQ)
此處我注冊的30秒執行一次 userOfflineDetection 函數
同時 cron 可同時注冊很多個定時任務, 只需使用 AddFunc 注冊即可
myCron.Start() 則啟動寄存器, 如果這個Goroutine中已經啟動了 Cron, 則不進行任何操作
需要注意的是, 在寄存器啟動后你仍然可以使用 AddFunc 來注冊新的定時任務, 也是可以正常的注冊的, 例如
myCron.Start()
myCron.AddFunc("* 1 * * *", userOfflineDetection)
如果你想要對每一個注冊過的定時任務進行控制, 還記得AddFunc返回的結果嗎, 其參數1是這個任務的ID, 參數二為可能的err錯誤
以上為 Cron 的基本用法, 希望對你有所幫助
