定时任务(cron)

页面摘要: 定时任务(cron)通过 node-schedule 在特定时间调度自定义函数,需在服务器配置中启用并可通过可选的任务文件定义。

WARNING

cron.enabled 配置选项应在 ./config/server.js(对于 TypeScript 项目为 ./config/server.ts)文件中设为 true。

cron 允许调度任意函数在特定的日期执行,并支持可选的重复规则。这些函数被称为定时任务(cron jobs)。cron 在任何给定时刻只使用一个计时器,而不是每秒/每分钟重新评估即将到来的任务。

此功能由 node-schedule 包提供支持。

cron 格式由以下部分组成:


*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    |
│    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun)
│    │    │    │    └───── month (1 - 12)
│    │    │    └────────── day of month (1 - 31)
│    │    └─────────────── hour (0 - 23)
│    └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)

要定义定时任务并使其在所需的时间运行:

  1. 创建相应的文件。
  2. 在服务器配置文件中启用定时任务。
TIP

可选地,定时任务也可以直接在服务器配置文件的 cron.tasks 键中创建。

创建定时任务

定时任务可以使用对象格式或键格式进行定义。

使用对象格式

要使用对象格式定义定时任务,请创建一个具有以下结构的文件:

JavaScript

module.exports = {
  /**
   * Simple example.
   * Every monday at 1am.
   */

  myJob: {
    task: ({ strapi }) => {
      // Add your own logic here (e.g. send a queue of email, create a database backup, etc.).
    },
    options: {
      rule: "0 0 1 * * 1",
    },
  },
};

TypeScript

export default {
  /**
   * Simple example.
   * Every monday at 1am.
   */

  myJob: {
    task: async ({ strapi }) => {
      // Add your own logic here (e.g. send a queue of email, create a database backup, etc.).
    },
    options: {
      rule: "0 0 1 * * 1",
    },
  },
};

进阶示例 #1:时区

以下定时任务在特定的时区运行:

JavaScript

module.exports = {
  /**
   * Cron job with timezone example.
   * Every Monday at 1am for Asia/Dhaka timezone.
   * List of valid timezones: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
   */

  myJob: {
    task: ({ strapi }) => {
      /* Add your own logic here */
    },
    options: {
      rule: "0 0 1 * * 1",
      tz: "Asia/Dhaka",
    },
  },
};

TypeScript

export default {
  /**
   * Cron job with timezone example.
   * Every Monday at 1am for Asia/Dhaka timezone.
   * List of valid timezones: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
   */

  myJob: {
    task: async ({ strapi }) => {
      /* Add your own logic here */
    },
    options: {
      rule: "0 0 1 * * 1",
      tz: "Asia/Dhaka",
    },
  },
};

进阶示例 #2:一次性定时任务

以下定时任务在给定时间仅运行一次:

JavaScript

module.exports = {
  myJob: {
    task: ({ strapi }) => {
      /* Add your own logic here */
    },
    // only run once after 10 seconds
    options: new Date(Date.now() + 10000),
  },
};

TypeScript

export default {
  myJob: {
    task: async ({ strapi }) => {
      /* Add your own logic here */
    },
    // only run once after 10 seconds
    options: new Date(Date.now() + 10000),
  },
};

进阶示例 #3:开始和结束时间

以下定时任务使用了开始和结束时间:

JavaScript

module.exports = {
  myJob: {
    task: ({ strapi }) => {
      /* Add your own logic here */
    },
    options: {
      rule: "* * * * * *",
      // start 10 seconds from now
      start: new Date(Date.now() + 10000),
      // end 20 seconds from now
      end: new Date(Date.now() + 20000),
    },
  },
};

TypeScript

export default {
  myJob: {
    task: async ({ strapi }) => {
      /* Add your own logic here */
    },
    // only run once after 10 seconds
    options: {
      rule: "* * * * * *",
      // start 10 seconds from now
      start: new Date(Date.now() + 10000),
      // end 20 seconds from now
      end: new Date(Date.now() + 20000),
    },
  },
};

使用键格式

WARNING

使用键格式会创建一个匿名的定时任务,在尝试禁用该任务或与某些插件配合时可能会出现问题。建议使用对象格式。

要使用键格式定义定时任务,请创建一个具有以下结构的文件:

JavaScript

module.exports = {
  /**
   * Simple example.
   * Every monday at 1am.
   */

  "0 0 1 * * 1": ({ strapi }) => {
    // Add your own logic here (e.g. send a queue of email, create a database backup, etc.).
  },
};

TypeScript

export default {
  /**
   * Simple example.
   * Every monday at 1am.
   */

  "0 0 1 * * 1": async ({ strapi }) => {
    // Add your own logic here (e.g. send a queue of email, create a database backup, etc.).
  },
};

启用定时任务

要启用定时任务,请在服务器配置文件中将 cron.enabled 设为 true 并声明任务:

JavaScript

const cronTasks = require("./cron-tasks");

module.exports = ({ env }) => ({
  host: env("HOST", "0.0.0.0"),
  port: env.int("PORT", 1337),
  cron: {
    enabled: true,
    tasks: cronTasks,
  },
});

TypeScript

import cronTasks from "./cron-tasks";

export default ({ env }) => ({
  host: env("HOST", "0.0.0.0"),
  port: env.int("PORT", 1337),
  cron: {
    enabled: true,
    tasks: cronTasks,
  },
});

添加或移除定时任务

在你的自定义代码中的任何位置使用 strapi.cron.add 来向 Strapi 实例添加定时任务:

module.exports = () => ({
  bootstrap({ strapi }) {
    strapi.cron.add({
      // runs every second
      myJob: {
        task: ({ strapi }) => {
          console.log("hello from plugin");
        },
        options: {
          rule: "* * * * * *",
        },
      },
    });
  },
});

在你的自定义代码中的任何位置使用 strapi.cron.remove 来从 Strapi 实例移除定时任务,传入要移除的定时任务对应的键:

strapi.cron.remove("myJob");
NOTE

使用键作为规则的定时任务无法被移除。

列出定时任务

在你的自定义代码中的任何位置使用 strapi.cron.jobs 来列出当前正在运行的所有定时任务:

strapi.cron.jobs