Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > go recover机制

go使用Cron定时实现recover机制

作者:mao毛

本文主要介绍了go使用Cron定时实现recover机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

robfig/cron v3 未实现recover

定时任务painc会导致程序内存数据丢失,发生重启,本教程是实现cron的recover机制。同样也适用于长连接场景,比如tcp链接后,用户发生行为调用rpc服务,但是在调用前的某些操作,被抽象出来了,编程不合理等场景,发生painc,会导致当前用户断开链接,数据丢失。

维护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 捕获运行异常! err :%v stack %s\n", c.Name, err, debug.Stack())
    }
}

cmd 导入原则,此部分可以修改

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机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文