定时任务(cron)
页面摘要: 定时任务(cron)通过
node-schedule在特定时间调度自定义函数,需在服务器配置中启用并可通过可选的任务文件定义。
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)
要定义定时任务并使其在所需的时间运行:
可选地,定时任务也可以直接在服务器配置文件的 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),
},
},
};
使用键格式
使用键格式会创建一个匿名的定时任务,在尝试禁用该任务或与某些插件配合时可能会出现问题。建议使用对象格式。
要使用键格式定义定时任务,请创建一个具有以下结构的文件:
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");
使用键作为规则的定时任务无法被移除。
列出定时任务
在你的自定义代码中的任何位置使用 strapi.cron.jobs 来列出当前正在运行的所有定时任务:
strapi.cron.jobs