go语言 robfig/cron包 实现定时 调用

摘要:
“,test)//每5秒一次,12×5=60,因此主线程退出fmt.Println}--------------------------------------------packagemainimportvalconstfuncinit(){logLevel:=os.GetenviflogLevel==”“{logLevel=”error“}logger,错误:=log.LoggerFromConfigAsStringifer=Nil{_=log.error}}functest(){fmt.Printftt++}funcmain(){fmt.Printlnttt=1c:=cron.New()c.AddFunc/Call c.AddFuncStart()//日志。Infoselect{}----------------functest(){log.Error}funcmin(){c:=cron.New()c.AddFunc/Call c.AddFunc everyday//Call c.Start()log.Infotime.Sleepfmt.Printlns everyday select{}//阻止主线程并不退出}cron表达式是一个字符串,该字符串由5或6个空格分隔,分为6或7个字段。每个字段代表一个含义。Cron有以下两种语法格式:Seconds Minutes HoursDayoffMonthDayoffWeekYear或:Seconds Minutes Hours DayoffMonth DayoffWeek每个字段可以有以下字符:Seconds:四个字符可以出现“,-*/”,有效范围是0-59整数分钟:四个字符可出现“,-*/”;有效范围为0-59的整数小时:可以出现四个字符“,-*/”;有效范围为0-23的整数月日:“,-*/?可以出现吗?
package main
import (
    "github.com/robfig/cron"
    "time"
    "fmt"
    "os"
    log "github.com/cihub/seelog"
)
var (
    ttt int
)
const (
    logFilePath = "hard/log/test/test.log"
)
func init() {
    logLevel := os.Getenv("LOG_LEVEL")
    if logLevel == "" {
        logLevel = "error"
    }
    logger, err := log.LoggerFromConfigAsString(`
    <seelog minlevel="` + logLevel + `" maxlevel="critical">
        <outputs formatid="common">
            <console />
            <rollingfile formatid="common" type="date" datepattern="2006-01-02"  filename="` + logFilePath + `" maxrolls="7"/>
        </outputs>
    
        <formats>
            <format   format="%Date %Time %LEVEL (%File:%Line) - %Msg%n"/>
        </formats>
    </seelog>
    `)
    if err != nil {
        _ = log.Errorf("load seelog config failed! message: %s", err)
    }
    err = log.ReplaceLogger(logger)
    if err != nil {
        _ = log.Error(err)
    }
}
func test(){
    
    fmt.Printf("test=%d
",ttt)
    ttt++
}
func main() {
    fmt.Println(os.Getenv("GOPATH"))
    ttt=1
    c := cron.New()
    c.AddFunc("0/5 * * * * ?", func() { log.Info("Every hour on the half hour") })
    c.AddFunc("0/5 * * * * ?", test)//5秒执行一次,12×5=60,所以一共执行12次
    c.Start()
    //log.Info("Every hour on the half hour")
    time.Sleep(time.Minute)    //一分钟后主线程退出
    fmt.Println("aaa")
}
----------------------------------------
package main
import (
    "github.com/robfig/cron"
//    "time"
    "fmt"
    "os"
    log "github.com/cihub/seelog"
)
var (
    ttt int
)
const (
    logFilePath = "D:\hard/log/test/test.log"
)
func init() {
    logLevel := os.Getenv("LOG_LEVEL")
    if logLevel == "" {
        logLevel = "error"
    }
    logger, err := log.LoggerFromConfigAsString(`
    <seelog minlevel="` + logLevel + `" maxlevel="critical">
        <outputs formatid="common">
            <console />
            <rollingfile formatid="common" type="date" datepattern="2006-01-02"  filename="` + logFilePath + `" maxrolls="7"/>
        </outputs>
    
        <formats>
            <format   format="%Date %Time %LEVEL (%File:%Line) - %Msg%n"/>
        </formats>
    </seelog>
    `)
    if err != nil {
        _ = log.Errorf("load seelog config failed! message: %s", err)
    }
    err = log.ReplaceLogger(logger)
    if err != nil {
        _ = log.Error(err)
    }
}
func test(){
    
    fmt.Printf("test=%d
",ttt)
    ttt++
}
func main() {
    fmt.Println(os.Getenv("GOPATH"))
    ttt=1
    c := cron.New()
    c.AddFunc("0 33 * * * * ", func() { log.Info("Every hour on the half hour") }) //每小时的第33分钟调用
    c.AddFunc("0 33 * * * * ", test)
    c.Start()
    //log.Info("Every hour on the half hour")
    select{}
    
}
-------------
func test(){
    log.Error("test")
}
func main() {
    c := cron.New()
    c.AddFunc("@daily", func() { log.Error("Every hour on the half hour") })//每天调用一次
    c.AddFunc("@midnight", test)//每天调用一次(和daily一样)
    c.Start()    
    log.Info("Every hour on the half hour")
    time.Sleep(time.Minute)
    fmt.Println("aaa")
    select{} //阻塞主线程不退出
}

  

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
 
Seconds Minutes Hours DayofMonth Month DayofWeek Year
或:
Seconds Minutes Hours DayofMonth Month DayofWeek
每一个域可出现的字符如下:
Seconds:          可出现     ", - * /"     四个字符,有效范围为0-59的整数
Minutes:          可出现     ", - * /"     四个字符,有效范围为0-59的整数
Hours:              可出现     ", - * /"     四个字符,有效范围为0-23的整数
DayofMonth:  可出现     ", - * / ? L W C"     八个字符,有效范围为0-31的整数
Month:             可出现     ", - * /"     四个字符,有效范围为1-12的整数或JAN-DEc
DayofWeek:    可出现     ", - * / ? L C #"     四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
Year:                 可出现     ", - * /"     四个字符,有效范围为1970-2099年
每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:
(1)     *:       表示匹配该域的任意值,假如在Minutes域使用*, 即表示每分钟都会触发事件。
(2)     ? :         只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。
 
(3)     -  :       表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
 
(4)     /:      表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
 
(5)     , :        表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
 
(6)    L:         表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
 
(7)    W:      表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一 到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份
 
(8)   LW:     这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
 

(9)   #:        用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

Cron表达式几个简单范例:
     每隔5秒执行一次:*/5 * * * * ?
     每隔1分钟执行一次:0 */1 * * * ?
     每天23点执行一次:0 0 23 * * ?
     每天凌晨1点执行一次:0 0 1 * * ?
     每月1号凌晨1点执行一次:0 0 1 1 * ?
     每月最后一天23点执行一次:0 0 23 L * ?
     每周星期天凌晨1点实行一次:0 0 1 ? * L
     在26分、29分、33分执行一次:0 26,29,33 * * * ?
     每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

免责声明:文章转载自《go语言 robfig/cron包 实现定时 调用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇最近3款Android APP逆向分析总结Qt 开发的界面程序封装成DLL,在VC中成功调用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

将元素移动到列表末尾

列表的操作在日常编程中很常见。人们可能会遇到希望仅使用单衬纸执行的各种问题。一个这样的问题可能是将列表元素移动到后面(列表末尾)。让我们讨论可以做到这一点的某些方法。 方法#1:使用append() + pop() + index()通过组合这些功能,可以在一行中执行此特定功能。append 函数使用 index 函数提供的索引添加 pop 函数删除的元素...

java框架之mybatis

一、简介 1、基本概念 mybatis 是一个半自动轻量级的一个 orm 框架 将 java 与 sql 分离,解决了 jdbc 的硬编码问题; sql 由开发人员控制,更加方便 sql 的修改调优; 2、入门程序 2.1 原始方法:通过 sqlsession 来操作数据库 建一个全局配置文件(mybatis-config.xml),配置数据源等运行...

MySQL中使用replace into语句批量更新表数据

作为示例,我们在这里使用名为testdb的数据库,并且在其中创建两张一模一样的表: drop table if exists test_table_1; create table test_table_1 ( name varchar(30) primary key, age integer ); drop table if exists...

Shell篇(三)TC Shell

Shell脚本的首行一般写为"#!+路径"来告诉系统,以路径所指定的程序来解释此脚本。              可以写为 #! /bin/tcsh -f (-f表示快速启动,不启动~/.tcshrc) Shell中的单引号' '  表示当Shell碰见第一个单引号时,它会忽略其后直到右引号的所有特殊字符。一般可用在alias              a...

智能指针之 auto_ptr

  C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理,该智能指针在C++11中已经被弃用,转而由unique_ptr替代,那这次使用和实现,就具体讲一下auto_ptr被弃用的原因,(编译平台:Linux centos 7.0 编译器:gcc 4.8.5 )   首先使用std::auto_ptr时,需要#include...

Qt 单元测试

    使用Qtcreator 自带的单元测试工具框架QTestlib进行测试。 一.创建一个单元测试程序 new project->other project ->Qt unit test 二.文件列表: qtestlib/tutorial1/testqstring.cpp qtestlib/tutorial1/tutorial1.pro...