# 定时触发

如果云函数需要定时/定期执行,即定时触发,您可以使用云函数定时触发器。已配置定时触发器的云函数,会在相应时间点被自动触发,函数的返回结果不会返回给调用方。

使用定时触发可以执行一些跑批任务,支付宝小程序定时触发最大超时时间为3小时,阿里云可以在使用定时触发时将云函数最高超时时间设置为600秒,腾讯云定时触发最大超时时间为900秒。

在uniCloud web控制台点击需要添加触发器的云函数详情,创建云函数触发器,格式如下:

腾讯云&支付宝云

// 参数是触发器数组,目前仅支持一个触发器,即数组只能填写一个,不可添加多个
// 实际添加时请务必去除注释
[
  {
    // name: 触发器的名字,规则见下方说明
    "name": "myTrigger",
    // type: 触发器类型,目前仅支持 timer (即定时触发器)
    "type": "timer",
    // config: 触发器配置,在定时触发器下,config 格式为 cron 表达式,规则见下方说明
    "config": "0 0 2 1 * * *"
  }
]

阿里云

["cron:0 0 * * * *"]

在package.json内配置定时触发时统一了云厂商的写法,请参考:云函数package.json

注意

  • 阿里云正式版最低触发间隔为1分钟,支付宝云与腾讯云最低触发间隔为1秒
  • 支付宝云与阿里云的cron表达式为6位,腾讯云为7位。相比腾讯云,支付宝云与阿里云缺少代表年份的第7位
  • 定时触发使用的是utc+8的时间
  • 定时执行的时间选在较为常见集中的时刻有极低概率出现执行失败的情况。建议避免整点(特别是0点),错开定时触发高峰期进行执行
  • 目前阿里云定时任务在运行时长超出配置的时间时会重试3次,此行为后续可能会调整。建议开发者将开启定时触发的云函数超时时间配置为600秒

# 字段规则

  • 定时触发器名称(name) :最大支持60个字符,支持 a-z, A-Z, 0-9, -_。必须以字母开头,且一个函数下不支持同名的多个定时触发器。
  • 定时触发器触发周期 (config):指定的函数触发时间。填写自定义标准的 Cron 表达式来决定何时触发函数。有关 Cron 表达式的更多信息,请参考以下内容。

# Cron 表达式

Cron 表达式有七个必需字段,按空格分隔。其中,每个字段都有相应的取值范围:

排序 字段 通配符
第一位 0 - 59的整数 , - * /
第二位 分钟 0 - 59的整数 , - * /
第三位 小时 0 - 23的整数 , - * /
第四位 1 - 31的整数(需要考虑月的天数) , - * /
第五位 1 - 12的整数 , - * /
第六位 星期 0 - 6的整数,其中0指星期日,1指星期一,以此类推 , - * /
第七位 1970 - 2099的整数(阿里云和支付宝云不支持第七位) , - * /

# 通配符

通配符 含义
,(逗号) 代表取用逗号隔开的字符的并集。例如:在“小时”字段中 1,2,3 表示1点、2点和3点
- (短横线) 包含指定范围的所有值。例如:在“日”字段中,1 - 15包含指定月份的1号到15号
* (星号) 表示所有值。在“小时”字段中,* 表示每个小时
/ (正斜杠) 指定增量。在“分钟”字段中,输入1/10以指定从第一分钟开始的每隔十分钟重复。例如,第11分钟、第21分钟和第31分钟,以此类推。正斜杠前后均需要有值,不可省略
  • 腾讯云:在 Cron 表达式中的“日”和“星期”字段同时指定值时,两者为“或”关系,即两者的条件均生效。
  • 阿里云:在 Cron 表达式中的“日”和“星期”字段同时指定值时会报错,“秒”不支持特殊字符。

# 辅助工具

# 示例

下面列举一些 Cron 表达式和相关含义:

示例 说明
* * * * * * * 每1秒触发一次(阿里云不支持,阿里云最短1分钟触发一次)
*/5 * * * * * * 每5秒触发一次(阿里云不支持,阿里云最短1分钟触发一次)
0 * * * * * * 每1分钟触发一次
0 */10 * * * * * 每10分钟触发一次
0 0 * * * * * 每1小时触发一次(整点触发)
0 20 * * * * * 每1小时触发一次(每小时的20分触发,如08:20:00、09:20:00)
0 0 */2 * * * * 每2小时触发一次(整点触发)
0 0 18 * * * * 每天的下午6点触发一次(整点触发,18:00:00)
0 0 10,14,16 * * * * 每天上午10点,下午2点,4点触发(整点触发,10:00:00、14:00:00、16:00:00)
0 */30 9-17 * * * * 每天上午9点到下午5点内每半小时触发
0 0 2 1 * * * 每月的1日的凌晨2点触发
0 15 10 * * 1-5 * 周一到周五每天上午10:15触发

# 云函数、云对象入参说明

使用定时触发器调用云函数时云函数会收到特定的参数。两个平台的参数如下:

腾讯云、支付宝云

{	
	"Time":"2020-04-08T10:22:31Z", //调用的云函数的时间
	"TriggerName":"myTrigger", //触发器名
	"Type":"Timer" //触发器类型,目前只有Timer
}

阿里云

{
  "triggerName": "TIMER_LATEST", //触发云函数的定时器配置内容,注意阿里云不会使用package.json内配置的触发器名称
  "triggerTime": "2020-04-08T10:22:31Z", //触发云函数时的时间戳,可能略晚于cron表达式时间
  // 以下三个属性新增于2023年7月14日
  "Time":"2020-04-08T10:22:31Z", //调用的云函数的时间
  "TriggerName":"TIMER_LATEST", //触发器名
  "Type":"Timer" //触发器类型,目前只有Timer
}

2023年7月14日起阿里云入参对齐腾讯云,保留上述triggerNametriggerTime(不再推荐使用这两个属性),增加TimeTriggerNameType

# 云对象使用定时触发

新增于HBuilderX 3.5.2

2023年7月14日起_timing方法可以获取定时触发参数

配置方式和云函数一致,请参阅上方章节

配置完成后会定时触发云对象内置特殊方法_timing

云对象代码示例:

module.exports = {
	_timing: function (param) {
    console.log('触发时间:', param.Time)
		console.log('triggered by timing')
	}
}

注意

  • 定时触发云对象时,_before_after均不执行