在本页中
调度 cron 任务
Deno.cron
接口使您能够使用 cron 语法 配置在可配置的计划上执行的 JavaScript 或 TypeScript 代码。在下面的示例中,我们配置了一个 JavaScript 代码块,它将每分钟执行一次。
Deno.cron("Log a message", "* * * * *", () => {
console.log("This will print once a minute.");
});
也可以使用 JavaScript 对象来定义 cron 计划。在下面的示例中,我们配置了一个 JavaScript 代码块,它将每小时执行一次。
Deno.cron("Log a message", { hour: { every: 1 } }, () => {
console.log("This will print once an hour.");
});
Deno.cron
接受三个参数
- cron 任务的人类可读名称
- cron 计划字符串或 JavaScript 对象,用于定义 cron 作业将在其上运行的计划
- 在给定计划上要执行的函数
如果您是 cron 语法的新手,那么有很多第三方模块,例如这个,可以帮助您生成 cron 计划字符串。
重试失败的运行 跳转到标题
失败的 cron 调用将使用默认重试策略自动重试。如果您想指定自定义重试策略,可以使用 backoffSchedule
属性来指定等待时间数组(以毫秒为单位),以便在再次重试函数调用之前等待。在以下示例中,我们将尝试重试失败的回调函数三次 - 在一秒、五秒和十秒后。
Deno.cron("Retry example", "* * * * *", () => {
throw new Error("Deno.cron will retry this three times, to no avail!");
}, {
backoffSchedule: [1000, 5000, 10000],
});
设计和限制 跳转到标题
以下是使用 Deno.cron
时需要注意的一些设计细节和限制。
任务必须在顶层模块作用域中定义 跳转到标题
Deno.cron
接口旨在支持基于预定义计划静态定义 cron 任务。所有 Deno.cron
任务都必须在模块的顶层定义。任何嵌套的 Deno.cron
定义(例如在 Deno.serve
处理程序内部)都将导致错误或被忽略。
如果您需要在 Deno 程序执行期间动态调度任务,可以使用 Deno Queues API。
时区 跳转到标题
Deno.cron
计划使用 UTC 时区指定。这有助于避免使用夏令时的时区出现问题。
重叠执行 跳转到标题
您的 cron 任务的下一次计划调用可能会与前一次调用重叠。如果发生这种情况,Deno.cron
将跳过下一次计划调用,以避免重叠执行。
星期几的数字表示 跳转到标题
Deno.cron
不使用基于 0 的星期几数字表示。相反,它使用 1-7(或 SUN-SAT)来表示从星期日到星期六。与其他使用 0-6 表示形式的 cron 引擎相比,这可能有所不同。
在 Deno Deploy 上的用法 跳转到标题
使用 Deno Deploy,您可以在云中的 V8 隔离区上运行您的后台任务。这样做时,有一些注意事项需要牢记。
与 Deno CLI 的差异 跳转到标题
与其他 Deno 运行时内置组件(如队列和 Deno KV)一样,Deno.cron
的实现在 Deno Deploy 上的工作方式略有不同。
cron 默认如何工作 跳转到标题
Deno.cron
在 Deno 运行时中的实现将执行状态保存在内存中。如果您运行多个使用 Deno.cron
的 Deno 程序,则每个程序都将拥有自己独立的 cron 任务集。
cron 在 Deno Deploy 上如何工作 跳转到标题
Deno Deploy 提供了 Deno.cron
的无服务器实现,该实现专为高可用性和规模而设计。Deno Deploy 在部署时自动提取您的 Deno.cron
定义,并使用按需隔离区安排它们执行。您最新的生产部署定义了计划执行的活动 cron 任务集。要添加、删除或修改 cron 任务,只需修改您的代码并创建新的生产部署。
Deno Deploy 保证您的 cron 任务在每个计划的时间间隔内至少执行一次。这通常意味着您的 cron 处理程序将在每个计划时间调用一次。在某些故障情况下,处理程序可能会在同一计划时间被多次调用。
Cron 仪表板 跳转到标题
当您进行包含 cron 任务的生产部署时,您可以在 Deploy 仪表板 中项目下的 Cron
选项卡中查看所有 cron 任务的列表。
定价 跳转到标题
Deno.cron
调用与入站 HTTP 请求到您的部署的收费标准相同。在此处了解有关定价的更多信息 here。
部署特定限制 跳转到标题
Deno.cron
仅适用于生产部署(不适用于预览部署)- 您的
Deno.cron
处理程序的精确调用时间可能与计划时间相差最多一分钟。
Cron 配置示例 跳转到标题
以下是一些常见的 cron 配置,为方便您而提供。
Deno.cron("Run once a minute", "* * * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every fifteen minutes", "*/15 * * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run once an hour, on the hour", "0 * * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every three hours", "0 */3 * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every day at 1am", "0 1 * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every Wednesday at midnight", "0 0 * * WED", () => {
console.log("Hello, cron!");
});
Deno.cron("Run on the first of the month at midnight", "0 0 1 * *", () => {
console.log("Hello, cron!");
});