gin结合cron,实现定时任务

cron需要进行初始化,在gin的main中进行,然后后面的定时任务,使用addjob,addjob会返回一个jobid,后面关闭时,可以使用这个id去关闭。
1.main.go中初始化cron

cronjobs.InitCron()

2.InitCron,返回一个Cron类型

var cj *cron.Cron

func InitCron() {
    logger := &CLog{clog: log.New()}
    logger.clog.SetFormatter(&log.TextFormatter{
        FullTimestamp:   true,
        TimestampFormat: "2006-01-02 15:04:05",
    })
    cj = cron.New(cron.WithChain(cron.SkipIfStillRunning(logger)))      
}


type CLog struct {
    clog *log.Logger
}

func (l *CLog) Info(msg string, keysAndValues ...interface{}) {
    l.clog.WithFields(log.Fields{
        "data": keysAndValues,
    }).Info(msg)
}

func (l *CLog) Error(err error, msg string, keysAndValues ...interface{}) {
    l.clog.WithFields(log.Fields{
        "msg":  msg,
        "data": keysAndValues,
    }).Warn(msg)
}

3.使用cj进行添加任务,任务会返回一个id,因为调用的时候会使用协程,将id通过channel返回

var ch = make(chan cron.EntryID)

 func StartJob(spec string, job tools.MqttJob) {
    id, _ := cj.AddJob(spec, &job)  
    ch <- id
    fmt.Printf("job任务: %+v", id)
    // 启动执行任务
    cj.Start()
    // 退出时关闭计划任务
    defer cj.Stop()
    // 如果使用 select{} 那么就一直会循环
    select {
    case <-job.Shut:
        return 
    }   
}

4.将id回收,已被删除定时任务时使用。另外实现mqttJob需要实现Run接口,addjob才能运行

func MqttAdd(interval int) (cron.EntryID){
    var job1 = tools.MqttJob{       
        ClientID : "test1",
        Shut: make(chan int, 1),
    }   
    cronStr := fmt.Sprintf("@every %ds", interval)
    go StartJob(cronStr, job1)
    id := <- ch
    return id
}

5.删除定时任务,cj为gin初始化的new cron

func MqttDel(id string) string {
    var jobid  cron.EntryID 
    ii, _ := strconv.Atoi(id)
    jobid = cron.EntryID(ii)
    cj.Remove(jobid)
    return "success"
}

你可能感兴趣的:(gin结合cron,实现定时任务)