zoukankan      html  css  js  c++  java
  • cronexpr任务调度

    package main
    
    import (
        "github.com/gorhill/cronexpr"
        "fmt"
        "time"
    )
    
    
    
    func main(){
        var(
            expr *cronexpr.Expression
            err error
            now time.Time
            nextTime time.Time
        )
    
        //if expr,err = cronexpr.Parse("* * * * *");err != nil{
        //    fmt.Println(err)
        //    return
        //}
        //expr = expr
    
        if expr,err = cronexpr.Parse("* * * * *");err !=nil{
            fmt.Println(err)
            return
        }
        expr = expr
    
        now = time.Now()
        nextTime = expr.Next(now)
        fmt.Println(now,nextTime)
    
    
        time.AfterFunc(nextTime.Sub(now), func() {
            fmt.Println("被调度了:",nextTime)
        })
    
        time.Sleep(50*time.Second)
    }
    2019-08-01 23:00:25.7892266 +0800 CST m=+0.017000401 2019-08-01 23:01:00 +0800 CST
    被调度了: 2019-08-01 23:01:00 +0800 CST
    
    Process finished with exit code 0

     调度多个cron任务

    package main
    
    import (
        "github.com/gorhill/cronexpr"
        "fmt"
        "time"
    )
    //代表一个任务
    type CronJob struct {
        expr *cronexpr.Expression
        nextTime time.Time//expr.Next(Now)
    }
    
    
    func main(){
        //需要有一个调度协程  它定时检查所有的cron任务 谁过期就执行谁
        var(
            expr *cronexpr.Expression
            now time.Time
            cronJob *CronJob
            scheduleTable map[string]*CronJob //key:任务名字
        )
    
        scheduleTable = make(map[string]*CronJob)
    
        now = time.Now()
    
        //1定义两个cronjob
        expr = cronexpr.MustParse("*/5 * * * * * *")
        cronJob = &CronJob{
            expr:expr,
            nextTime:expr.Next(now),
        }
    
        scheduleTable["job1"] = cronJob
    
        expr = cronexpr.MustParse("*/5 * * * * * *")
        cronJob = &CronJob{
            expr:expr,
            nextTime:expr.Next(now),
        }
    
        scheduleTable["job2"] = cronJob
    
        go func() {
            var(
                jobName string
                cronJob *CronJob
                now time.Time
            )
            //定时检查一下任务调度表
            for{
                now = time.Now()
                for jobName ,cronJob = range scheduleTable{
                    if cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now){
                        go func(jobName string) {
                            fmt.Println("执行:",jobName)
                        }(jobName)
                        cronJob.nextTime = cronJob.expr.Next(now)
                        fmt.Println("下次执行时间:",cronJob.nextTime)
                    }
                }
    
                //睡眠100毫秒
                select {
                    case <-time.NewTimer(100*time.Millisecond).C://1将在100毫秒可读 返回
    
                }
            }
        }()
    
        time.Sleep(time.Second*100)
    
    }
    下次执行时间: 2019-08-03 14:44:15 +0800 CST
    下次执行时间: 2019-08-03 14:44:15 +0800 CST
    执行: job2
    执行: job1
    下次执行时间: 2019-08-03 14:44:20 +0800 CST
    下次执行时间: 2019-08-03 14:44:20 +0800 CST
    执行: job2
    执行: job1
    下次执行时间: 2019-08-03 14:44:25 +0800 CST
    下次执行时间: 2019-08-03 14:44:25 +0800 CST
    执行: job1
    执行: job2
    下次执行时间: 2019-08-03 14:44:30 +0800 CST
    执行: job1
    执行: job2
    下次执行时间: 2019-08-03 14:44:30 +0800 CST
    下次执行时间: 2019-08-03 14:44:35 +0800 CST
    下次执行时间: 2019-08-03 14:44:35 +0800 CST
    执行: job1
    执行: job2
    下次执行时间: 2019-08-03 14:44:40 +0800 CST
    执行: job2
    下次执行时间: 2019-08-03 14:44:40 +0800 CST
    执行: job1
  • 相关阅读:
    zookeeper03
    微服务网关Zuul
    微服务网关概述
    服务熔断Hystrix高级
    服务熔断Hystrix入门
    微服务架构的高并发问题
    服务注册和发现总结
    服务调用Feign高级
    服务调用Feign入门
    负载均衡Ribbon高级
  • 原文地址:https://www.cnblogs.com/sunlong88/p/11285947.html
Copyright © 2011-2022 走看看