文章目录
目录
- robfig/cron v3 未实现recover
- 维护handler,defer 处理recover
- cmd 导入原则,此部分可以修改
定时任务painc会导致程序内存数据丢失,发生重启,本教程是实现cron的recover机制。同样也适用于长连接场景,比如tcp链接后,用户发生行为调用rpc服务,但是在调用前的某些操作,被抽象出来了,编程不合理等场景,发生painc,会导致当前用户断开链接,数据丢失。
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 捕获运行异常! err :%v stack %sn", c.Name, err, debug.Stack())
}
}
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("任务已存在,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
}
到此这篇关于go使用Cron定时实现recover机制的文章就介绍到这了,更多相关go recover机制内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- GO语言异常处理机制panic和recover分析
- golang 中 recover()的使用方法
- go语言异常panic和恢复recover用法实例
- go语言的panic和recover函数用法实例
- Golang中panic与recover的区别
- Go panic和recover函数使用细节深入探究
- Go中recover与panic区别详解
- Golang Recover处理错误原理解析
- Golang利用Recover进行错误处理
- golang recover函数使用中的一些坑解析