[TOC]

计划任务

from Godoc

包cron实现了cron规范解析器和作业运行器。

安装

要下载特定的标记版本,请运行:

go get github.com/robfig/cron/[email protected]

将其导入您的程序中:

import “github.com/robfig/cron/v3”

由于Go Modules的使用,它需要Go 1.11或更高版本。

用法

呼叫者可以在给定的时间表上注册要调用的Func。Cron将在他们自己的goroutines中运行它们。

CRON表达格式

cron表达式表示一组时间,使用5个以空格分隔的字段。

| 字段名称 | 强制性? | 允许值 | 允许特殊字符 |

| ————– | ——– | ————- | ———— |

| 分钟 | 是的 | 0-59 | * /, – |

| 小时 | 是的 | 0-23 | * /, – |

| 一个月的某一天 | 是的 | 1-31 | * /, – ? |

| 月 | 是的 | 1-12或JAN-DEC | * /, – |

| 星期几 | 是的 | 0-6或SUN-SAT | * /, – ? |

月份和星期几字段值不区分大小写。“SUN”,“Sun”和“sun”同样被接受。

该格式的具体解释基于Cron维基百科页面:https://en.wikipedia.org/wiki/Cron

替代格式

备用Cron表达式格式支持其他字段,如秒。您可以通过创建自定义Parser来实现,如下所示。

cron.New(

cron.WithParser(

cron.NewParser(

cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor)))

**由于添加Seconds是对标准cron规范的最常见修改,cron提供了一个内置函数来执行此操作,这相当于您之前看到的自定义解析器,除了它的秒字段是必需的: **

cron.New(cron.WithSeconds())

这模仿Quartz,最流行的替代Cron计划格式:http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/tutorials/tutorial-lesson-06.html

cron特定字符说明

特殊字符

星号(*)

星号表示cron表达式将匹配该字段的所有值; 例如,在第5个字段(月)中使用星号表示每个月。

斜线(/)

斜杠用于描述范围的增量。例如,第1场(分钟)中的3-59 / 15表示小时的第3分钟,之后每15分钟。形式“* \ / …”等同于“first-last / …”形式,即在该字段的最大可能范围内的增量。形式“N / …”被接受为“N-MAX / …”,即从N开始,使用增量直到该特定范围的结束。它没有环绕。

逗号(,)

逗号用于分隔列表的项目。例如,在第5个字段(星期几)中使用“MON,WED,FRI”将表示星期一,星期三和星期五。

连字符( – )

连字符用于定义范围。例如,9-17表示每天上午9点到下午5点之间的每小时。

问号(?)

可以使用问号而不是’*’来留下日期或星期几的空白。

预定义的时间表

您可以使用几个预定义的计划之一来代替cron表达式。

进入 说明 相当于
@yearly(或@annually) 每年一次,午夜,1月1日 0 0 1 1 *
@monthly 每月运行一次,午夜,月初 0 0 1 * *
@weekly 每周一次,午睡/周日午夜 0 0 * * 0
@daily(或@midnight) 每天运行一次,午夜 0 0 * * *
@hourly 每小时运行一次,小时开始 0 * * * *

间隔

您还可以安排作业以固定的时间间隔执行,从添加或运行cron开始。这可以通过格式化cron规范来支持,如下所示:

@every

其中“duration”是time.ParseDuration(http://golang.org/pkg/time/#ParseDuration)接受的字符串。

例如,“@ every 1h30m10s”表示在1小时30分10秒之后激活的计划,然后是之后的每个间隔。

注意: 间隔不会考虑作业运行时。例如,如果作业需要3分钟才能运行,并且计划每5分钟运行一次,则每次运行之间只有2分钟的空闲时间。

cron举例说明

时区

默认情况下,所有解释和计划都在计算机的本地时区(time.Local)中完成。您可以在构造中指定不同的时区:

单个cron调度还可以通过在cron规范的开头提供CRON_TZ=Asia/Tokyo.覆盖它们将被解释的时区。

例如:

传统兼容性还支持前缀“TZ =(TIME ZONE)”。

请注意,在夏令时跨越式过渡期间安排的作业将无法运行!

作业包装机/链条

Cron运行器可以配置一系列作业包装器,以便为所有提交的作业添加横切功能。例如,它们可用于实现以下效果:

  • 从作业中恢复任何恐慌(默认激活)

  • 如果先前的运行尚未完成,则延迟作业的执行

  • 如果之前的运行尚未完成,则跳过作业的执行

  • 记录每个作业的调用

    使用cron.WithChain选项为添加到cron的所有作业安装包装器:

通过显式包装它们来为各个作业安装包装器:

线程安全

由于Cron服务与调用代码同时运行,因此必须采取一些措施以确保正确同步。

只要调用者确保调用在它们之间进行排序之前有明确的发生,所有cron方法都被设计为正确同步。

记录

Cron定义了一个Logger接口,它是github.com/go-logr/logr中定义的接口的一个子集。它有两个日志记录级别(信息和错误),参数是键/值对。这使得cron日志记录可以插入结构化日志记录系统。提供了一个适配器[Verbose] PrintfLogger来包装标准库* log.Logger。

为了进一步了解Cron操作,可以激活详细日志记录,这将记录作业运行,调度决策以及添加或删除的作业。使用一次性记录器激活它,如下所示:

履行

Cron条目存储在一个数组中,按其下一个激活时间排序。Cron睡着,直到下一份工作开始运行。

醒来后:

  • 它运行在该秒钟上处于活动状态的每个条目
  • 它计算运行的作业的下一个运行时间
  • 它按下一个激活时间重新排序条目数组。
  • 它会一直睡到最快的工作。