# 定时器(定时任务)

以实现1小时自动请求一次指定的云函数为例

  • 1、编写 client/timedTask/pub/autoCancelOrder 的云函数,写定时任务的业务逻辑。(没有则新建)

  • 2、右键 cloudfunctions 目录 新建云函数,取名为 z_timer1(名字任意,这里以 z_timer1 为定时器1号的名称)

  • 3、复制定时器模板代码到 z_timer1index.js

'use strict';
exports.main = async (event, context) => {
  /**
  * 定时器1号 - 自动取消订单
  */
  let res = { code:0, msg:"" };
  res.callFunctionResult = await uniCloud.callFunction({
    name: "router",
    data: {
      // 需要执行的云函数路径
      $url: "client/timedTask/pub/autoCancelOrder" , 
      // 请求参数,这里加个key可以有效防止云函数被直接访问,云函数中加判断条件,如果key不是666666,则不运行。
      data:{
        key:"666666"
      }
    }
  });
  return res;
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • 4、编写 z_timer1/package.json 的代码
{
  "name": "z_timer1",
  "main": "index.js",
  "version": "1.0.0",
  "description": "",
  "cloudfunction-config": {
    "concurrency": 1,
    "memorySize": 512,
    "path": "",
    "timeout": 600,
    "triggers": [{
      "config": "0 0 * * * * *",
      "name": "z_timer1",
      "type": "timer"
    }],
    "runtime": "Nodejs12"
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

cloudfunction-config 的子参数含义

注意:不可直接复制下面的代码,因为package.json文件不可以写注释 注意:不可直接复制下面的代码,因为package.json文件不可以写注释 注意:不可直接复制下面的代码,因为package.json文件不可以写注释

定时任务阿里云最长运行 7200秒 腾讯云 900秒 支付宝小程序云 180秒(但支付宝小程序云后面会支持异步执行)

// 注意:不可直接复制下面的代码,因为`package.json`文件不可以写注释
{
  "concurrency": 1, // 阿里云专属,固定为1即可
  "memorySize": 512, // 函数的最大可用内存,单位MB,可选值: 128|256|512|1024|2048,默认值512
  "path": "", // 云函数Url化path部分(定时器不需要填)
  "timeout": 600, // 函数的超时时间,单位秒,阿里云最长7200秒 腾讯云900秒
  // triggers 字段是触发器数组,目前仅支持一个触发器,即数组只能填写一个,不可添加多个
  "triggers": [{
     // config: 触发器配置,在定时触发器下,config 格式为 cron 表达式,规则见 https://uniapp.dcloud.net.cn/uniCloud/trigger
    "config": "0 0 2 1 * * *", 
    "name": "z_timer1",// name: 触发器的名字
    "type": "timer", // 触发器类型 固定为 timer
  }]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • 5、右键 z_timer1 上传部署

  • 6、完成

# Cron 表达式

Cron 表达式有七个必需字段(阿里云是6个),按空格分隔。

位数 说明
1 0-59 的整数
2 分钟 0-59 的整数
3 小时 0-23 的整数
4 1-31 的整数(需要考虑月的天数)
5 1-12 的整数
6 星期 0-6 的整数 或 SUN,MON,TUE,WED,THU,FRI,SAT;其中 0 指周日,1 指周一,依次类推,6 指周六
7 1970~2099 的整数 (阿里云没有这个,但是仍需将第七位设置为*)

# 通配符

通配符 说明
, (逗号) 代表取用逗号隔开的字符的并集。例如:在“小时”字段中 1,2,3 表示1点、2点和3点
- (破折号) 包含指定范围的所有值。例如:在“日”字段中,1-15 包含指定月份的 1 号到 15 号
* (星号) 表示所有值。在“小时”字段中,* 表示每个小时
/ (正斜杠) 指定增量。在“分钟”字段中,输入 1/10 以指定从第一分钟开始的每隔十分钟重复。例如,第 11 分钟、第 21 分钟和第 31 分钟,依此类推

# 注意事项

  • 在 Cron 表达式中的“日”和“星期”字段同时指定值时,两者为“或”关系,即两者的条件分别均生效。
  • 触发器规则的时区为 UTC+8

# 示例

下面展示了一些 Cron 表达式和相关含义的示例:

示例 说明 云厂商兼容性
* * * * * * * 每1秒触发一次(阿里云不支持) 腾讯云、支付宝云
*/5 * * * * * * 每5秒触发一次(阿里云不支持) 腾讯云、支付宝云
0 * * * * * * 每1分钟触发一次(每分的0秒触发) all
10 * * * * * * 每1分钟触发一次(每分的第10秒触发) all
0 */10 * * * * * 每10分钟触发一次 all
0 1/10 * * * * * 每10分钟触发一次(如:08:11:00、08:21:00、08:31:00,依此类推 all
0 0 * * * * * 每1小时触发一次(整点触发) all
0 10 * * * * * 每1小时触发一次(每小时的10分触发,如08:10:00、09:10:00) all
0 0 */2 * * * * 每2小时触发一次(整点触发) all
0 0 18 * * * * 每天的下午6点触发一次(整点触发,18:00:00) all
0 0 10,14,16 * * * * 每天上午10点,下午2点,4点触发(整点触发,10:00:00、14:00:00、16:00:00) all
0 */30 9-17 * * * * 每天上午9点到下午5点内每半小时触发 all
0 0 2 1 * * * 每月的1日的凌晨2点触发 all
0 15 10 * * 1-5 * 周一到周五每天上午10:15触发 腾讯云、阿里云
0 0 12 * * 3 * 每个星期三中午12点触发 腾讯云、阿里云

兼容性总结

  1. 阿里云不支持秒级触发(最低是1分钟)
  2. 支付宝云不支持星期参数