go使用Cron定時(shí)實(shí)現(xiàn)recover機(jī)制
robfig/cron v3 未實(shí)現(xiàn)recover
定時(shí)任務(wù)painc會(huì)導(dǎo)致程序內(nèi)存數(shù)據(jù)丟失,發(fā)生重啟,本教程是實(shí)現(xiàn)cron的recover機(jī)制。同樣也適用于長(zhǎng)連接場(chǎng)景,比如tcp鏈接后,用戶(hù)發(fā)生行為調(diào)用rpc服務(wù),但是在調(diào)用前的某些操作,被抽象出來(lái)了,編程不合理等場(chǎng)景,發(fā)生painc,會(huì)導(dǎo)致當(dāng)前用戶(hù)斷開(kāi)鏈接,數(shù)據(jù)丟失。
維護(hù)handler,defer 處理recover
type CornDesc struct {
Name string
Spec string
NewFunc func()
}
func (c *CornDesc) Handle() {
defer c.final()
c.NewFunc()
}
func (c *CornDesc) final() {
if err := recover(); err != nil {
fmt.Printf("%s 捕獲運(yùn)行異常! err :%v stack %s\n", c.Name, err, debug.Stack())
}
}
cmd 導(dǎo)入原則,此部分可以修改
var _Machine *Machine
type Machine struct {
*cron.Cron
exist map[string]int
}
func InitMachine(c *cron.Cron) *Machine {
if _Machine == nil {
_Machine = &Machine{
Cron: c,
exist: make(map[string]int),
}
}
return _Machine
}
func BaseMachine() *Machine {
return _Machine
}
func (m *Machine) Run() {
m.Cron.Run()
}
func (m *Machine) verify(cronDesc *CornDesc) error {
if id, ok := m.exist[cronDesc.Name]; ok {
return fmt.Errorf("任務(wù)已存在,name %s id %d", cronDesc.Name, id)
}
return nil
}
func (m *Machine) Register(cornDesc *CornDesc) error {
if err := m.verify(cornDesc); err != nil {
return err
}
id, err := m.Cron.AddFunc(cornDesc.Spec, cornDesc.Handle)
if err != nil {
return err
}
m.exist[cornDesc.Name] = int(id)
return nil
}
到此這篇關(guān)于go使用Cron定時(shí)實(shí)現(xiàn)recover機(jī)制的文章就介紹到這了,更多相關(guān)go recover機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- GO語(yǔ)言異常處理機(jī)制panic和recover分析
- golang?中?recover()的使用方法
- go語(yǔ)言異常panic和恢復(fù)recover用法實(shí)例
- go語(yǔ)言的panic和recover函數(shù)用法實(shí)例
- Golang中panic與recover的區(qū)別
- Go panic和recover函數(shù)使用細(xì)節(jié)深入探究
- Go中recover與panic區(qū)別詳解
- Golang Recover處理錯(cuò)誤原理解析
- Golang利用Recover進(jìn)行錯(cuò)誤處理
- golang?recover函數(shù)使用中的一些坑解析
相關(guān)文章
Go語(yǔ)言實(shí)現(xiàn)可靠的UDP 協(xié)議的示例詳解
UDP(用戶(hù)數(shù)據(jù)報(bào)協(xié)議)是一種無(wú)連接、輕量級(jí)的傳輸層協(xié)議,這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言實(shí)現(xiàn)可靠的UDP 協(xié)議,需要的小伙伴可以了解下2025-07-07
Golang中crypto/cipher加密標(biāo)準(zhǔn)庫(kù)全面指南
本文主要介紹了Golang中crypto/cipher加密標(biāo)準(zhǔn)庫(kù),包括對(duì)稱(chēng)加密、非對(duì)稱(chēng)加密以及使用流加密和塊加密算法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
Golang環(huán)境變量設(shè)置和查看工具go env詳解
go env 是 Go 工具鏈中的一個(gè)命令,用于設(shè)置和查看當(dāng)前 Golang 環(huán)境的相關(guān)信息,對(duì)于理解、編譯和運(yùn)行 Golang 程序非常有用,本文就給大家簡(jiǎn)單的介紹一下Golang環(huán)境變量設(shè)置和查看工具go env,需要的朋友可以參考下2023-07-07
Go調(diào)度器學(xué)習(xí)之協(xié)作與搶占詳解
如果某個(gè)G執(zhí)行時(shí)間過(guò)長(zhǎng),其他的G如何才能被正常調(diào)度,這就引出了接下來(lái)的話(huà)題:協(xié)作與搶占。本文將通過(guò)一些示例為大家詳細(xì)講講調(diào)度器中協(xié)作與搶占的相關(guān)知識(shí),需要的可以參考一下2023-04-04
使用Go語(yǔ)言實(shí)現(xiàn)HTTP客戶(hù)端請(qǐng)求并解析響應(yīng)的完整流程
在日常開(kāi)發(fā)中,無(wú)論是調(diào)用 RESTful API、采集網(wǎng)頁(yè)數(shù)據(jù),還是進(jìn)行微服務(wù)之間的通信,HTTP 客戶(hù)端幾乎無(wú)處不在,本文聚焦于如何使用 Go 實(shí)現(xiàn)一個(gè) HTTP 客戶(hù)端,完成請(qǐng)求發(fā)送、響應(yīng)解析、錯(cuò)誤處理、Header與Body提取等完整流程,需要的朋友可以參考下2025-08-08
Golang實(shí)現(xiàn)檢測(cè)SSL證書(shū)有效期
本文主要為大家詳細(xì)介紹如何使用Go語(yǔ)言中的crypto/tls模塊來(lái)獲取網(wǎng)站的SSL/TLS證書(shū)信息并檢查其有效期,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-04-04

